173 lines
5.0 KiB
NASM
173 lines
5.0 KiB
NASM
;
|
|
; Copyright 2020 Electronic Arts Inc.
|
|
;
|
|
; TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
|
|
; software: you can redistribute it and/or modify it under the terms of
|
|
; the GNU General Public License as published by the Free Software Foundation,
|
|
; either version 3 of the License, or (at your option) any later version.
|
|
|
|
; TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
|
|
; in the hope that it will be useful, but with permitted additional restrictions
|
|
; under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
|
|
; distributed with this program. You should have received a copy of the
|
|
; GNU General Public License along with permitted additional restrictions
|
|
; with this program. If not, see [https://github.com/electronicarts/CnC_Remastered_Collection]>.
|
|
|
|
;***************************************************************************
|
|
;** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
|
|
;***************************************************************************
|
|
;* *
|
|
;* Project Name : Westwood 32 bit Library *
|
|
;* *
|
|
;* File Name : REMAP.ASM *
|
|
;* *
|
|
;* Programmer : Phil W. Gorrow *
|
|
;* *
|
|
;* Start Date : July 1, 1994 *
|
|
;* *
|
|
;* Last Update : July 1, 1994 [PWG] *
|
|
;* *
|
|
;*-------------------------------------------------------------------------*
|
|
;* Functions: *
|
|
;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
|
|
|
|
|
|
IDEAL
|
|
P386
|
|
MODEL USE32 FLAT
|
|
|
|
INCLUDE ".\drawbuff.inc"
|
|
INCLUDE ".\gbuffer.inc"
|
|
|
|
|
|
CODESEG
|
|
|
|
PROC Buffer_Remap C NEAR
|
|
USES eax,ebx,ecx,edx,esi,edi
|
|
|
|
;*===================================================================
|
|
;* Define the arguements that our function takes.
|
|
;*===================================================================
|
|
ARG this_object:DWORD
|
|
ARG x0_pixel:DWORD
|
|
ARG y0_pixel:DWORD
|
|
ARG region_width:DWORD
|
|
ARG region_height:DWORD
|
|
ARG remap :DWORD
|
|
|
|
;*===================================================================
|
|
; Define some locals so that we can handle things quickly
|
|
;*===================================================================
|
|
local x1_pixel : DWORD
|
|
local y1_pixel : DWORD
|
|
local win_width : dword
|
|
local counter_x : dword
|
|
|
|
|
|
cmp [ remap ] , 0
|
|
jz ??real_out
|
|
|
|
; Clip Source Rectangle against source Window boundaries.
|
|
mov esi , [ this_object ] ; get ptr to src
|
|
xor ecx , ecx
|
|
xor edx , edx
|
|
mov edi , [ (GraphicViewPort esi) . GVPWidth ] ; get width into register
|
|
mov ebx , [ x0_pixel ]
|
|
mov eax , [ x0_pixel ]
|
|
add ebx , [ region_width ]
|
|
shld ecx , eax , 1
|
|
mov [ x1_pixel ] , ebx
|
|
inc edi
|
|
shld edx , ebx , 1
|
|
sub eax , edi
|
|
sub ebx , edi
|
|
shld ecx , eax , 1
|
|
shld edx , ebx , 1
|
|
|
|
mov edi,[ ( GraphicViewPort esi) . GVPHeight ] ; get height into register
|
|
mov ebx , [ y0_pixel ]
|
|
mov eax , [ y0_pixel ]
|
|
add ebx , [ region_height ]
|
|
shld ecx , eax , 1
|
|
mov [ y1_pixel ] , ebx
|
|
inc edi
|
|
shld edx , ebx , 1
|
|
sub eax , edi
|
|
sub ebx , edi
|
|
shld ecx , eax , 1
|
|
shld edx , ebx , 1
|
|
|
|
xor cl , 5
|
|
xor dl , 5
|
|
mov al , cl
|
|
test dl , cl
|
|
jnz ??real_out
|
|
or al , dl
|
|
jz ??do_remap
|
|
|
|
test cl , 1000b
|
|
jz ??scr_left_ok
|
|
mov [ x0_pixel ] , 0
|
|
|
|
??scr_left_ok:
|
|
test cl , 0010b
|
|
jz ??scr_bottom_ok
|
|
mov [ y0_pixel ] , 0
|
|
|
|
??scr_bottom_ok:
|
|
test dl , 0100b
|
|
jz ??scr_right_ok
|
|
mov eax , [ (GraphicViewPort esi) . GVPWidth ] ; get width into register
|
|
mov [ x1_pixel ] , eax
|
|
??scr_right_ok:
|
|
test dl , 0001b
|
|
jz ??do_remap
|
|
mov eax , [ (GraphicViewPort esi) . GVPHeight ] ; get width into register
|
|
mov [ y1_pixel ] , eax
|
|
|
|
|
|
??do_remap:
|
|
cld
|
|
mov edi , [ (GraphicViewPort esi) . GVPOffset ]
|
|
mov eax , [ (GraphicViewPort esi) . GVPXAdd ]
|
|
mov ebx , [ x1_pixel ]
|
|
add eax , [ (GraphicViewPort esi) . GVPWidth ]
|
|
add eax , [ (GraphicViewPort esi) . GVPPitch ]
|
|
mov esi , eax
|
|
mul [ y0_pixel ]
|
|
add edi , [ x0_pixel ]
|
|
sub ebx , [ x0_pixel ]
|
|
jle ??real_out
|
|
add edi , eax
|
|
sub esi , ebx
|
|
|
|
mov ecx , [ y1_pixel ]
|
|
sub ecx , [ y0_pixel ]
|
|
jle ??real_out
|
|
mov eax , [ remap ]
|
|
mov [ counter_x ] , ebx
|
|
xor edx , edx
|
|
|
|
??outer_loop:
|
|
mov ebx , [ counter_x ]
|
|
??inner_loop:
|
|
mov dl , [ edi ]
|
|
mov dl , [ eax + edx ]
|
|
mov [ edi ] , dl
|
|
inc edi
|
|
dec ebx
|
|
jnz ??inner_loop
|
|
add edi , esi
|
|
dec ecx
|
|
jnz ??outer_loop
|
|
|
|
|
|
|
|
|
|
??real_out:
|
|
ret
|
|
|
|
ENDP Buffer_Remap
|
|
|
|
END
|