CnC_Red_Alert/WIN32LIB/SRCDEBUG/STMPCACH.ASM

285 lines
9.3 KiB
NASM

;
; Command & Conquer Red Alert(tm)
; Copyright 2025 Electronic Arts Inc.
;
; This program 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.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
;
;***************************************************************************
;** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
;***************************************************************************
;* *
;* Project Name : Westwood Library *
;* *
;* File Name : STAMP.ASM *
;* *
;* Programmer : Joe L. Bostic *
;* *
;* Start Date : August 23, 1993 *
;* *
;* Last Update : August 23, 1993 [JLB] *
;* *
;*-------------------------------------------------------------------------*
;* Functions: *
;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
IDEAL
P386
MODEL USE32 FLAT
JUMPS
MAX_CACHED_ICONS=300
ICON_WIDTH =24
ICON_HEIGHT =24
MAX_ICON_SETS =100
global C IconPointers:dword
global C Init_Stamps:near
global C IconCacheLookup:word
global LastIconset:dword
global MapPtr:dword
global IconCount:dword
global IconSize:dword
global StampPtr:dword
global IconEntry:dword
global IconData:dword
global Clear_Icon_Pointers_:near
global Cache_Copy_Icon_:near
global Is_Icon_Cached_:near
global Get_Icon_Index_:near
global Get_Free_Index_:near
global Cache_New_Icon_:near
global Is_Stamp_Registered_:near
global Get_Free_Cache_Slot_:near
struc IconSetType
IconSetPtr dd ?
IconListOffset dd ?
ends
global C IconSetList:IconSetType
codeseg
;************************************************************************************************
;* Cache_Copy_Icon -- copy an icon to its video memory cache *
;* *
;* *
;* INPUT: eax - ptr to icon_data *
;* edx - ptr to video surface *
;* ebx - pitch of video surface *
;* *
;* OUTPUT: none *
;* *
;* PROTO: extern "C" Cache_Copy_Icon (void const *icon_ptr , *
;* VideoSurfaceDescription.lpSurface , *
;* VideoSurfaceDescription.lPitch); *
;* *
;* HISTORY: *
;* 11/8/95 3:16PM ST: Created *
;*==============================================================================================*
proc Cache_Copy_Icon_ near
pushad
mov esi,eax
mov edi,edx
sub ebx,ICON_WIDTH
mov dl,ICON_HEIGHT ;icon height
??each_line_lp: mov ecx,ICON_WIDTH/4
rep movsd
lea edi,[edi+ebx]
dec dl
jnz ??each_line_lp
popad
ret
endp Cache_Copy_Icon_
;************************************************************************************************
;* Is_Icon_Cached -- has an icon been cached? If not, is it cacheable? *
;* *
;* *
;* INPUT: eax - ptr to icon_data *
;* edx - icon number *
;* *
;* OUTPUT: eax - index of cached icon or -1 if not cached *
;* *
;* PROTO: extern "C" int Is_Icon_Cached (void const *icon_data , int icon); *
;* *
;* HISTORY: *
;* 11/8/95 2:16PM ST: Created *
;*==============================================================================================*
proc Is_Icon_Cached_ near
mov [IconData],eax ;save the icon data ptr for later
push edx
test eax,eax
je ??out
; Initialize the stamp data if necessary.
cmp [LastIconset],eax
je short ??noreset
call Init_Stamps C,eax
; Determine if the icon number requested is actually in the set.
; Perform the logical icon to actual icon number remap if necessary.
??noreset: cmp [MapPtr],0
je short ??notmap
push edi
mov edi,[MapPtr]
mov dl,[edi+edx]
pop edi
??notmap: cmp edx,[IconCount]
jl ??in_range
pop edx
mov eax,-1
ret
; See if the stamp is registered - if not then it cant be cached
??in_range: mov eax,[IconData]
call Is_Stamp_Registered_
cmp eax,-1
jnz ??got_entry
pop edx
ret
; Stamp is registered - if its cached already then just return the index
??got_entry: mov eax,[(IconSetType eax).IconListOffset]
cmp [word eax+edx*2+IconCacheLookup],-1
jz ??not_cached
; it is cached and [eax+edx] is the index
movzx eax,[word eax+edx*2+IconCacheLookup]
pop edx
ret
;
; The stamps set is registered but we havn't seen this stamp before
; so try caching it
;
??not_cached: mov [IconEntry],eax
add [IconEntry],edx
add [IconEntry],edx
call Get_Free_Cache_Slot_
test eax,eax
jge ??got_free_slot
pop edx ;eax is -1 here anyway
ret
; We found a free caching slot so try caching the stamp into it
??got_free_slot:imul edx,[IconSize]
add edx,[StampPtr]
push eax
call Cache_New_Icon_ ;takes icon index in eax, ptr to icon in edx
test eax,eax
jz ??cache_failed
; Success! Add the index into the table
pop eax
mov edx,[IconEntry]
mov [edx+IconCacheLookup],ax
and eax,0ffffh
pop edx
ret
; Couldnt cache the new Icon - return -1 to say icon isnt cached
??cache_failed: pop eax
??out: pop edx
mov eax,-1
ret
endp Is_Icon_Cached_
;************************************************************************************************
;* Is_Stamp_Registered -- has an icon's set been previously registered? *
;* *
;* *
;* INPUT: eax - ptr to icon_data *
;* *
;* OUTPUT: eax - ptr to registration entry or -1 if not registered *
;* *
;* PROTO: extern "C" int Is_Stamp_Registered (void const *icon_data); *
;* *
;* HISTORY: *
;* 11/10/95 10:00AM ST: Created *
;*==============================================================================================*
proc Is_Stamp_Registered_
push edi
push ecx
mov edi,offset IconSetList
mov ecx,MAX_ICON_SETS
??each_set_lp: cmp eax,[edi]
jz ??got_icon_set
add edi,size IconSetType
dec ecx
jnz ??each_set_lp
mov eax,-1
pop ecx
pop edi
ret
??got_icon_set: mov eax,edi
pop ecx
pop edi
ret
endp Is_Stamp_Registered_
dataseg
IconEntry dd 0 ;Temporary pointer to icon index entry in table
IconData dd 0 ;Temporary ptr to icon set data
end