;************************************************************************* ;** 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 Intel Corporation. ;** All Rights Reserved. ;** ;************************************************************************* ;// ;// $Header: S:\h26x\src\dec\adjpels.asv 1.2 22 Dec 1995 15:54:30 KMILLS $ ;// ;// $Log: S:\h26x\src\dec\adjpels.asv $ ;// ;// Rev 1.2 22 Dec 1995 15:54:30 KMILLS ;// ;// added new copyright notice ;// ;// Rev 1.1 31 Oct 1995 10:50:56 BNICKERS ;// Save/restore ebx. ;// ;// Rev 1.0 01 Sep 1995 17:14:04 DBRUCKS ;// add adjustpels ;* ;* Rev 1.0 29 Mar 1995 12:17:14 BECHOLS ;* Initial revision. ;// ;// Rev 1.2 07 Dec 1994 16:21:04 BNICKERS ;// Prepare entry sequence for flat model. ;// ;// Rev 1.1 05 Dec 1994 09:45:18 BNICKERS ;// Prepare for flat model. ;// ;// Rev 1.0 15 Jul 1994 11:10:20 BECHOLS ;// Initial revision. ;// ;//////////////////////////////////////////////////////////////////////////// ; ; adjpels -- This function adjusts pel values to track the user's tinkering ; with brightness, contrast, and saturation knobs. Each call ; to this function adjusts one plane. OPTION PROLOGUE:None OPTION EPILOGUE:ReturnAndRelieveEpilogueMacro include locals.inc ;include decinst.inc IFNDEF DSEGNAME IFNDEF WIN32 DSEGNAME TEXTEQU ENDIF ENDIF IFDEF WIN32 .xlist include memmodel.inc .list .DATA ELSE DSEGNAME SEGMENT WORD PUBLIC 'DATA' ENDIF ; any data would go here IFNDEF WIN32 DSEGNAME ENDS .xlist include memmodel.inc .list ENDIF IFNDEF SEGNAME IFNDEF WIN32 SEGNAME TEXTEQU <_CODE32> ENDIF ENDIF ifdef WIN32 .CODE else SEGNAME SEGMENT PARA PUBLIC USE32 'CODE' endif ifdef WIN32 ASSUME cs : FLAT ASSUME ds : FLAT ASSUME es : FLAT ASSUME fs : FLAT ASSUME gs : FLAT ASSUME ss : FLAT else ASSUME CS : SEGNAME ASSUME DS : Nothing ASSUME ES : Nothing ASSUME FS : Nothing ASSUME GS : Nothing endif ; void FAR ASM_CALLTYPE AdjustPels (U8 FAR * InstanceBase, ; X32 PlaneBase, ; DWORD PlaneWidth, ; DWORD PlanePitch, ; DWORD PlaneHeight, ; X32 AdjustmentTable); ; ; In 16-bit Microsoft Windows (tm), InstanceBase provides the segment ; descriptor for the plane and the adjustment table. ; ; In 32-bit Microsoft Windows (tm), InstanceBase provides the base to apply ; to the plane base and the adjustment table. PUBLIC AdjustPels ; due to the need for the ebp reg, these parameter declarations aren't used, ; they are here so the assembler knows how many bytes to relieve from the stack AdjustPels proc DIST LANG AInstanceBase: DWORD, APlaneBase: DWORD, APlaneWidth: DWORD, APlanePitch: DWORD, APlaneHeight: DWORD, AAdjustmentTable: DWORD IFDEF WIN32 LocalFrameSize = 0 RegisterStorageSize = 16 ; Arguments: InstanceBase = LocalFrameSize + RegisterStorageSize + 4 PlaneBase = LocalFrameSize + RegisterStorageSize + 8 PlaneWidth = LocalFrameSize + RegisterStorageSize + 12 PlanePitch = LocalFrameSize + RegisterStorageSize + 16 PlaneHeight = LocalFrameSize + RegisterStorageSize + 20 AdjustmentTable = LocalFrameSize + RegisterStorageSize + 24 EndOfArgList = LocalFrameSize + RegisterStorageSize + 28 ; No Locals (on local stack frame) LCL EQU ELSE RegisterStorageSize = 20 ; Put local variables on stack. ; Arguments: InstanceBase_zero = RegisterStorageSize + 4 InstanceBase_SegNum = RegisterStorageSize + 6 PlaneBase = RegisterStorageSize + 8 PlaneWidth = RegisterStorageSize + 12 PlanePitch = RegisterStorageSize + 14 PlaneHeight = RegisterStorageSize + 16 AdjustmentTable = RegisterStorageSize + 18 EndOfArgList = RegisterStorageSize + 20 LCL EQU <> ENDIF push esi push edi push ebp push ebx IFDEF WIN32 sub esp,LocalFrameSize mov eax,PD InstanceBase[esp] mov esi,PD AdjustmentTable[esp] mov edi,PD PlaneBase[esp] add esi,eax add edi,eax mov ecx,PD PlaneWidth[esp] mov edx,PD PlaneHeight[esp] mov ebp,PD PlanePitch[esp] ELSE xor eax,eax mov eax,ds push eax mov ebp,esp and ebp,00000FFFFH mov ds, PW [ebp+InstanceBase_SegNum] movzx esi,PW [ebp+AdjustmentTable] mov edi,PD [ebp+PlaneBase] movzx ecx,PW [ebp+PlaneWidth] movzx edx,PW [ebp+PlaneHeight] movzx ebp,PW [ebp+PlanePitch] ENDIF sub ebp,ecx xor ebx,ebx shl ecx,5 dec edx shl edx,16 xor eax,eax ; Register usage: ; ebp -- skip distance, i.e. pitch minus width. ; esi -- Adjustment table address. ; edi -- Plane cursor. ; edx[16:31] -- height. ; dh -- width counter. ; ch -- width. ; dl -- An adjusted pel. ; cl -- An adjusted pel. ; bl -- A raw pel. ; al -- A raw pel. NextLine: mov al,PB [edi ] mov bl,PB [edi+4] mov dh,ch Next8Pels: mov cl,PB [esi+eax] mov dl,PB [esi+ebx+256+16] ; Table duplicated; avoids many bank conflicts. mov al,PB [edi+1] mov bl,PB [edi+5] mov PB [edi ],cl mov PB [edi+4],dl mov cl,PB [esi+eax] mov dl,PB [esi+ebx+256+16] mov al,PB [edi+2] mov bl,PB [edi+6] mov PB [edi+1],cl mov PB [edi+5],dl mov cl,PB [esi+eax] mov dl,PB [esi+ebx+256+16] mov al,PB [edi+3] mov bl,PB [edi+7] mov PB [edi+2],cl mov PB [edi+6],dl mov cl,PB [esi+eax] mov dl,PB [esi+ebx+256+16] mov al,PB [edi+8] mov bl,PB [edi+12] mov PB [edi+3],cl mov PB [edi+7],dl add edi,8 dec dh jne Next8Pels add edi,ebp sub edx,000010000H jge NextLine IFDEF WIN32 add esp,LocalFrameSize ELSE pop ebx mov ds,ebx ENDIF pop ebx pop ebp pop edi pop esi rturn AdjustPels endp IFNDEF WIN32 SEGNAME ENDS ENDIF END