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.
317 lines
8.6 KiB
317 lines
8.6 KiB
;/* *************************************************************************
|
|
;** INTEL Corporation Proprietary Information
|
|
;**
|
|
;** This listing is supplied under the terms of a license
|
|
;** agreement with INTEL Corporation and may not be copied
|
|
;** nor disclosed except in accordance with the terms of
|
|
;** that agreement.
|
|
;**
|
|
;** Copyright (c) 1995, 1996 Intel Corporation.
|
|
;** All Rights Reserved.
|
|
;**
|
|
;** *************************************************************************
|
|
;*/
|
|
|
|
|
|
;--------------------------------------------------------------------------;
|
|
;
|
|
; d3xpand.asm
|
|
;
|
|
; Description:
|
|
; This routine expands a picture frame by 16 or 8 bytes in all
|
|
; directions for unrestricted motion vector mode. It assumes
|
|
; that there is space in memory around the existing frame
|
|
; and simply writes to there (i.e., clobbers it), and that
|
|
; the pitch is 384 (distance in bytes between vertically
|
|
; adjacent pels). See Below.
|
|
;
|
|
; Routines: prototypes in:
|
|
; ExpandPlane d3dec.cpp
|
|
;
|
|
; Data:
|
|
; This routine assumes that the PITCH is 384.
|
|
;
|
|
; Inputs (dwords pushed onto stack by caller):
|
|
; StartPtr flat pointer to the first byte of the
|
|
; original frame.
|
|
; FrameWidth Width (in bytes) of the original frame.
|
|
; THIS MUST BE AT LEAST 32 & A MULTIPLE OF 4.
|
|
; FrameHeight Height (in rows) of the original frame.
|
|
; Pels Number of pels to expand the plane.
|
|
; 16 for lumina, 8 for chroma. This MUST
|
|
; BE A MULTIPLE OF 8.
|
|
;
|
|
;--------------------------------------------------------------------------;
|
|
|
|
;--------------------------------------------------------------------------;
|
|
;
|
|
; $Header: S:\h26x\src\dec\d35xpand.asv 1.2 08 Mar 1996 16:48:16 AGUPTA2 $
|
|
; $Log: S:\h26x\src\dec\d35xpand.asv $
|
|
;//
|
|
;// Rev 1.2 08 Mar 1996 16:48:16 AGUPTA2
|
|
;// Changed the meaning of last parameter. New and faster way to expand planes.
|
|
;//
|
|
;//
|
|
;// Rev 1.0 27 Nov 1995 11:28:30 RMCKENZX
|
|
;// Initial revision.
|
|
;
|
|
;--------------------------------------------------------------------------;
|
|
|
|
|
|
.586
|
|
.MODEL FLAT
|
|
|
|
; make all symbols case sensitive
|
|
OPTION CASEMAP:NONE
|
|
|
|
.CODE
|
|
;--------------------------------------------------------------------------;
|
|
;
|
|
; The algorithm fills in (1) the bottom (not including corners),
|
|
; then (2) the sides (including the bottom corners, but not the
|
|
; top corners), then (3) the top (including the top
|
|
; corners) as shown below, replicating the outermost bytes
|
|
; of the original frame outward:
|
|
;
|
|
; ----------------------------
|
|
; | |
|
|
; | (3) |
|
|
; | |
|
|
; |----------------------------|
|
|
; | | | |
|
|
; | | | |
|
|
; | | | |
|
|
; | | original | |
|
|
; | | frame | |
|
|
; | | | |
|
|
; | (2) | | (2) |
|
|
; | | | |
|
|
; | | | |
|
|
; | |----------------| |
|
|
; | | | |
|
|
; | | (1) | |
|
|
; | | | |
|
|
; ----------------------------
|
|
;
|
|
; Register Usage:
|
|
;
|
|
; esi pointer for stages (1) and (2).
|
|
; edi pointer for stages (2) and (3).
|
|
; ecx loop control.
|
|
; eax, ebx dword to be written. In stage (2), it is formed
|
|
; from 4 (shifted) copies of the border byte. (i.e.,
|
|
; byte 0d2h replicates to 0d2d2d2d2h.)
|
|
; edx, ebp pointers.
|
|
;
|
|
;--------------------------------------------------------------------------;
|
|
;
|
|
; Version: 5.0
|
|
; Date: 4 March 1996
|
|
; Author: R. McKenzie
|
|
;
|
|
; Notes: The essential features of this version are:
|
|
; 1. Re-organized to fill bottom first, then sides,
|
|
; finally top
|
|
; 2. Code is optimized for the case that the expanded
|
|
; plane is 32-byte aligned. No checking is performed
|
|
; to verify this assumption and this routine will run
|
|
; significantly SLOWER (though correctly) if this
|
|
; assumption is not true.
|
|
;
|
|
;--------------------------------------------------------------------------;
|
|
|
|
;-------------------;
|
|
; Stack Usage ;
|
|
;-------------------;
|
|
; register storage
|
|
; edi esp+00
|
|
; esi esp+04
|
|
; ebx esp+08
|
|
; ebp esp+12
|
|
|
|
; return address esp+16
|
|
|
|
; C input parameters
|
|
StartPtr EQU esp+20
|
|
FrameWidth EQU esp+24
|
|
FrameHeight EQU esp+28
|
|
Pels EQU esp+32
|
|
|
|
PITCH = 384
|
|
|
|
|
|
PUBLIC C ExpandPlane
|
|
|
|
ExpandPlane:
|
|
push ebp
|
|
push ebx
|
|
|
|
push esi
|
|
push edi
|
|
|
|
|
|
;--------------------------------------;
|
|
; fill the bottom ;
|
|
;--------------------------------------;
|
|
mov esi, [StartPtr] ; ptr1 = StartPtr
|
|
mov edi, [FrameHeight]
|
|
|
|
shl edi, 7
|
|
mov ebp, PITCH
|
|
|
|
lea edi, [edi+2*edi-PITCH] ; PITCH * (FrameHeight-1)
|
|
mov edx, [FrameWidth] ; column bound
|
|
|
|
add esi, edi ; esi = bottom left corner
|
|
nop
|
|
|
|
|
|
;-------Start Outer Bottom Loop--------;
|
|
OuterBottomLoop:
|
|
mov edi, esi ; destination pointer
|
|
mov ecx, [Pels] ; row bound
|
|
|
|
mov eax, 0[esi]
|
|
mov ebx, 4[esi]
|
|
|
|
|
|
;-------Start Inner Bottom Loop--------;
|
|
InnerBottomLoop:
|
|
mov 0[edi+ebp], eax
|
|
mov 4[edi+ebp], ebx
|
|
|
|
add edi, ebp
|
|
dec ecx
|
|
|
|
jne InnerBottomLoop
|
|
;--------End Inner Bottom Loop---------;
|
|
|
|
|
|
add esi, 8
|
|
sub edx, 8
|
|
|
|
jne OuterBottomLoop
|
|
;--------End Outer Bottom Loop---------;
|
|
|
|
|
|
;--------------------------------------;
|
|
; Fill both sides from bottom up ;
|
|
;--------------------------------------;
|
|
mov ecx, [FrameHeight]
|
|
mov edx, [Pels]
|
|
|
|
add ecx, edx ; ecx = row count
|
|
add edi, 8 ; edi = Right pointer
|
|
|
|
mov eax, [FrameWidth]
|
|
mov esi, edi
|
|
|
|
sub esi, eax ; esi = Left pointer
|
|
nop
|
|
|
|
|
|
;--------Start Outer Sides Loop--------;
|
|
OuterSidesLoop:
|
|
xor eax, eax
|
|
xor ebx, ebx
|
|
|
|
mov al, [esi]
|
|
push ecx ; save row counter
|
|
|
|
mov bl, [edi-1]
|
|
mov ah, [esi]
|
|
|
|
mov bh, [edi-1]
|
|
mov ebp, eax
|
|
|
|
shl eax, 16
|
|
mov edx, ebx
|
|
|
|
shl ebx, 16
|
|
or eax, ebp
|
|
|
|
or ebx, edx
|
|
mov ebp, esi ; Left Pointer
|
|
|
|
mov edx, edi ; Right Pointer
|
|
mov ecx, [Pels+4] ; column counter
|
|
|
|
|
|
;--------Start Inner Sides Loop--------;
|
|
InnerSidesLoop:
|
|
mov [ebp-4], eax
|
|
mov [ebp-8], eax
|
|
|
|
mov [edx], ebx
|
|
mov [edx+4], ebx
|
|
|
|
sub ebp, 8
|
|
add edx, 8
|
|
|
|
sub ecx, 8
|
|
jne InnerSidesLoop
|
|
;---------End Inner Sides Loop---------;
|
|
|
|
|
|
pop ecx
|
|
sub esi, PITCH
|
|
|
|
sub edi, PITCH
|
|
dec ecx
|
|
|
|
jne OuterSidesLoop
|
|
;---------End Outer Sides Loop---------;
|
|
|
|
|
|
;--------------------------------------;
|
|
; Fill the Top ;
|
|
;--------------------------------------;
|
|
mov ecx, [Pels] ; ptr1 = StartPtr
|
|
mov edx, [FrameWidth] ; column bound
|
|
|
|
add esi, PITCH
|
|
mov ebp, -PITCH
|
|
|
|
sub esi, ecx
|
|
lea edx, [edx+2*ecx] ; FrameWidth + 2 * Pels
|
|
|
|
|
|
;---------Start Outer Top Loop---------;
|
|
OuterTopLoop:
|
|
mov edi, esi ; destination pointer
|
|
mov ecx, [Pels] ; row bound
|
|
|
|
mov eax, 0[esi]
|
|
mov ebx, 4[esi]
|
|
|
|
|
|
;---------Start Inner Top Loop---------;
|
|
InnerTopLoop:
|
|
mov 0[edi+ebp], eax
|
|
mov 4[edi+ebp], ebx
|
|
|
|
add edi, ebp
|
|
dec ecx
|
|
|
|
jne InnerTopLoop
|
|
;----------End Inner Top Loop----------;
|
|
|
|
|
|
add esi, 8
|
|
sub edx, 8
|
|
|
|
jne OuterTopLoop
|
|
;----------End Outer Top Loop----------;
|
|
|
|
;--------------------------------------;
|
|
; Wrap up and go home ;
|
|
;--------------------------------------;
|
|
pop edi
|
|
pop esi
|
|
|
|
pop ebx
|
|
pop ebp
|
|
|
|
ret
|
|
|
|
END
|