285 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
