Initial Source Code commit
Initial commit of original Tiberian Dawn and Red Alert source code converted to build as DLLs, and compatible with the release version of Command & Conquer Remastered.
This commit is contained in:
parent
ea8ecc76fa
commit
03416d24e1
1038 changed files with 629779 additions and 0 deletions
182
REDALERT/CPUID.ASM
Normal file
182
REDALERT/CPUID.ASM
Normal file
|
@ -0,0 +1,182 @@
|
|||
;
|
||||
; 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]>.
|
||||
|
||||
; $Header: F:\projects\c&c0\vcs\code\cpuid.asv 5.0 11 Nov 1996 09:40:28 JOE_BOSTIC $
|
||||
;***************************************************************************
|
||||
;** 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 I N C **
|
||||
;***************************************************************************
|
||||
;* *
|
||||
;* Project Name : Command & Conquer *
|
||||
;* *
|
||||
;* File Name : MMX.ASM *
|
||||
;* *
|
||||
;* Programmer : Steve Tall *
|
||||
;* *
|
||||
;* Start Date : May 19th, 1996 *
|
||||
;* *
|
||||
;* Last Update : May 19th 1996 [ST] *
|
||||
;* *
|
||||
;*-------------------------------------------------------------------------*
|
||||
;* Functions: *
|
||||
;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
|
||||
|
||||
|
||||
.586
|
||||
.model flat
|
||||
|
||||
;
|
||||
; Variables externs
|
||||
;
|
||||
GLOBAL C CPUType:byte
|
||||
;externdef C CPUType:byte
|
||||
GLOBAL C VendorID:byte
|
||||
;externdef C VendorID:byte
|
||||
|
||||
;
|
||||
; Function externs
|
||||
;
|
||||
GLOBAL C Detect_MMX_Availability:near
|
||||
;externdef C Detect_MMX_Availability:near
|
||||
|
||||
|
||||
.code
|
||||
|
||||
|
||||
;*********************************************************************************************
|
||||
;* Detect_MMX_Availability -- Detect the presence of MMX technology. *
|
||||
;* *
|
||||
;* *
|
||||
;* INPUT: Nothing *
|
||||
;* *
|
||||
;* OUTPUT: True if MMX technology is available. *
|
||||
;* *
|
||||
;* Warnings: *
|
||||
;* *
|
||||
;* Note: Based in part on CPUID32.ASM by Intel *
|
||||
;* *
|
||||
;* HISTORY: *
|
||||
;* 05/19/96 ST : Created. *
|
||||
;*===========================================================================================*
|
||||
|
||||
Detect_MMX_Availability proc C
|
||||
|
||||
local idflag:byte
|
||||
local cputype:byte
|
||||
|
||||
;assume processor is at least 386
|
||||
;
|
||||
;check whether AC bit in eflags can be toggled.
|
||||
;If not then processor is 386
|
||||
|
||||
mov [idflag],0
|
||||
|
||||
pushfd ;get Eflags in EAX
|
||||
pop eax
|
||||
mov ecx,eax ;save eflags
|
||||
xor eax,40000h ;toggle AC bit in eflags
|
||||
push eax ;new eflags on stack
|
||||
popfd ;move new value into eflags
|
||||
pushfd ;get new eflags back into eax
|
||||
pop eax
|
||||
xor eax,ecx ;if AC bit not toggled then CPU=386
|
||||
mov [cputype],3
|
||||
jz @@end_get_cpu ;cpu is 386
|
||||
|
||||
push ecx
|
||||
popfd ;restore AC bit in eflags
|
||||
|
||||
|
||||
;processor is at least 486
|
||||
;
|
||||
;Check for ability to set/clear ID flag in EFLAGS
|
||||
;ID flag indicates ability of processor to execute the CPUID instruction.
|
||||
;486 not guaranteed to have CPUID inst?
|
||||
;
|
||||
mov [cputype],4
|
||||
mov eax,ecx ;original EFLAGS
|
||||
xor eax,200000h ;toggle ID bit
|
||||
push eax
|
||||
popfd
|
||||
pushfd
|
||||
pop eax
|
||||
xor eax,ecx ;check if still toggled
|
||||
jz @@end_get_cpu
|
||||
|
||||
|
||||
; Execute CPUID instruction to determine vendor, family,
|
||||
; model and stepping.
|
||||
;
|
||||
|
||||
mov [idflag],1 ;flag ID is available
|
||||
|
||||
xor eax,eax
|
||||
cpuid
|
||||
|
||||
mov dword ptr [VendorID],ebx
|
||||
mov dword ptr [VendorID+4],edx
|
||||
mov dword ptr [VendorID+8],ecx
|
||||
mov dword ptr [VendorID+12]," "
|
||||
|
||||
cmp eax,1 ;check if 1 is valid
|
||||
jl @@end_get_cpu ;inp for cpuid inst.
|
||||
|
||||
xor eax,eax
|
||||
inc eax
|
||||
|
||||
cpuid ;get stepping, model and family
|
||||
|
||||
and ax,0f00H
|
||||
shr ax,08H
|
||||
|
||||
mov [cputype],al
|
||||
|
||||
@@end_get_cpu: mov al,[cputype]
|
||||
mov [CPUType],al
|
||||
|
||||
|
||||
;
|
||||
; We have the CPU type in al now.
|
||||
; If we arent on at least a pentium then we can assume there is no MMX
|
||||
;
|
||||
cmp al,5
|
||||
jl @@no_mmx
|
||||
|
||||
mov eax,1
|
||||
cpuid
|
||||
test edx,00800000h
|
||||
jz @@no_mmx
|
||||
|
||||
;
|
||||
; MMX detected - return true
|
||||
;
|
||||
mov eax,1
|
||||
ret
|
||||
|
||||
|
||||
@@no_mmx: xor eax,eax
|
||||
ret
|
||||
|
||||
|
||||
Detect_MMX_Availability endp
|
||||
|
||||
|
||||
.data
|
||||
|
||||
CPUType db 0
|
||||
VendorID db "Not available",0,0,0,0,0,0
|
||||
|
||||
|
||||
end
|
||||
|
Reference in a new issue