project64/Source/Project64/N64 System/C Core/X86.h

284 lines
18 KiB
C

/*
* Project 64 - A Nintendo 64 emulator.
*
* (c) Copyright 2001 zilmar (zilmar@emulation64.com) and
* Jabo (jabo@emulation64.com).
*
* pj64 homepage: www.pj64.net
*
* Permission to use, copy, modify and distribute Project64 in both binary and
* source form, for non-commercial purposes, is hereby granted without fee,
* providing that this license information and copyright notice appear with
* all copies and any derived work.
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event shall the authors be held liable for any damages
* arising from the use of this software.
*
* Project64 is freeware for PERSONAL USE only. Commercial users should
* seek permission of the copyright holders first. Commercial use includes
* charging money for Project64 or software derived from Project64.
*
* The copyright holders request that bug fixes and improvements to the code
* should be forwarded to them so if they want them.
*
*/
#ifdef __cplusplus
extern "C" {
#endif
//Little hack to be able to get an address of a member class
//with out looking at type safety
void * GetAddressOf(int value, ...);
#define AddressOf(Addr) GetAddressOf(5,(Addr))
enum x86RegValues {
x86_Any = 0,x86_EAX,x86_EBX,x86_ECX,x86_EDX,x86_ESI,x86_EDI,x86_EBP, x86_ESP, x86_Any8Bit
};
enum x86FpuValues {
x86_ST0,x86_ST1,x86_ST2,x86_ST3,x86_ST4,x86_ST5,x86_ST6,x86_ST7
};
#define x86_Name(Reg) (Reg) == x86_EAX ? "eax" : (Reg) == x86_EBX ? "ebx" :\
(Reg) == x86_ECX ? "ecx" : (Reg) == x86_EDX ? "edx" :\
(Reg) == x86_ESI ? "esi" : (Reg) == x86_EDI ? "edi" :\
(Reg) == x86_ESP ? "esp" : (Reg) == x86_EBP ? "ebp" :\
"Unknown x86 Register"
#define x86Byte_Name(Reg) (Reg) == x86_EAX ? "al" : (Reg) == x86_EBX ? "bl" :\
(Reg) == x86_ECX ? "cl" : (Reg) == x86_EDX ? "dl" :\
"Unknown x86 Register"
#define x86Half_Name(Reg) (Reg) == x86_EAX ? "ax" : (Reg) == x86_EBX ? "bx" :\
(Reg) == x86_ECX ? "cx" : (Reg) == x86_EDX ? "dx" :\
(Reg) == x86_ESI ? "si" : (Reg) == x86_EDI ? "di" :\
(Reg) == x86_ESP ? "sp" : (Reg) == x86_EBP ? "bp" :\
"Unknown x86 Register"
void WriteX86Comment ( const char * Label);
void WriteX86Label ( const char * Label);
void AdcX86regToVariable ( int x86reg, void * Variable, const char * VariableName );
void AdcConstToVariable ( void *Variable, const char * VariableName, BYTE Constant );
void AdcConstToX86Reg ( int x86Reg, DWORD Const );
void AdcVariableToX86reg ( int x86reg, void * Variable, const char * VariableName );
void AdcX86RegToX86Reg ( int Destination, int Source );
void AddConstToVariable ( DWORD Const, void *Variable, const char * VariableName );
void AddConstToX86Reg ( int x86Reg, DWORD Const );
void AddVariableToX86reg ( int x86reg, void * Variable, const char * VariableName );
void AddX86regToVariable ( int x86reg, void * Variable, const char * VariableName );
void AddX86RegToX86Reg ( int Destination, int Source );
void AndConstToVariable ( DWORD Const, void *Variable, const char * VariableName );
void AndConstToX86Reg ( int x86Reg, DWORD Const );
void AndVariableToX86Reg ( void * Variable, const char * VariableName, int x86Reg );
void AndVariableDispToX86Reg ( void * Variable, const char * VariableName, int x86Reg, int AddrReg, int Multiplier);
void AndX86RegToX86Reg ( int Destination, int Source );
void X86BreakPoint ( LPCSTR FileName, int LineNumber );
void Call_Direct ( void * FunctAddress, char * FunctName );
void Call_Indirect ( void * FunctAddress, char * FunctName );
void CompConstToVariable ( DWORD Const, void * Variable, const char * VariableName );
void CompConstToX86reg ( int x86Reg, DWORD Const );
void CompX86regToVariable ( int x86Reg, void * Variable, const char * VariableName );
void CompVariableToX86reg ( int x86Reg, void * Variable, const char * VariableName );
void CompX86RegToX86Reg ( int Destination, int Source );
void DecX86reg ( int x86Reg );
void DivX86reg ( int x86reg );
void idivX86reg ( int x86reg );
void imulX86reg ( int x86reg );
void IncX86reg ( int x86Reg );
void JaeLabel8 ( char * Label, BYTE Value );
void JaeLabel32 ( char * Label, DWORD Value );
void JaLabel8 ( char * Label, BYTE Value );
void JaLabel32 ( char * Label, DWORD Value );
void JbLabel8 ( char * Label, BYTE Value );
void JbLabel32 ( char * Label, DWORD Value );
void JecxzLabel8 ( char * Label, BYTE Value );
void JeLabel8 ( char * Label, BYTE Value );
void JeLabel32 ( char * Label, DWORD Value );
void JgeLabel32 ( char * Label, DWORD Value );
void JgLabel8 ( char * Label, BYTE Value );
void JgLabel32 ( char * Label, DWORD Value );
void JleLabel8 ( char * Label, BYTE Value );
void JleLabel32 ( char * Label, DWORD Value );
void JlLabel8 ( char * Label, BYTE Value );
void JlLabel32 ( char * Label, DWORD Value );
void JmpDirectReg ( int x86reg );
void JmpIndirectLabel32 ( char * Label, DWORD location );
void JmpIndirectReg ( int x86reg );
void JmpLabel8 ( char * Label, BYTE Value );
void JmpLabel32 ( char * Label, DWORD Value );
void JneLabel8 ( char * Label, BYTE Value );
void JneLabel32 ( char * Label, DWORD Value );
void JnsLabel8 ( char * Label, BYTE Value );
void JnsLabel32 ( char * Label, DWORD Value );
void JsLabel32 ( char * Label, DWORD Value );
void LeaRegReg ( int x86RegDest, int x86RegSrc, int multiplier );
void LeaSourceAndOffset ( int x86DestReg, int x86SourceReg, int offset );
void MoveConstByteToN64Mem ( BYTE Const, int AddrReg );
void MoveConstHalfToN64Mem ( WORD Const, int AddrReg );
void MoveConstByteToVariable ( BYTE Const,void *Variable, const char * VariableName );
void MoveConstByteToX86regPointer ( BYTE Const, int AddrReg1, int AddrReg2 );
void MoveConstHalfToVariable ( WORD Const, void *Variable, const char * VariableName );
void MoveConstHalfToX86regPointer ( WORD Const, int AddrReg1, int AddrReg2 );
void MoveConstToMemoryDisp ( DWORD Const, int AddrReg, DWORD Disp );
void MoveConstToN64Mem ( DWORD Const, int AddrReg );
void MoveConstToN64MemDisp ( DWORD Const, int AddrReg, BYTE Disp );
void MoveConstToVariable ( DWORD Const, void *Variable, const char * VariableName );
void MoveConstToX86Pointer ( DWORD Const, int X86Pointer );
void MoveConstToX86reg ( DWORD Const, int x86reg );
void MoveConstToX86regPointer ( DWORD Const, int AddrReg1, int AddrReg2 );
void MoveN64MemDispToX86reg ( int x86reg, int AddrReg, BYTE Disp );
void MoveN64MemToX86reg ( int x86reg, int AddrReg );
void MoveN64MemToX86regByte ( int x86reg, int AddrReg );
void MoveN64MemToX86regHalf ( int x86reg, int AddrReg );
void MoveSxByteX86regPointerToX86reg ( int AddrReg1, int AddrReg2, int x86reg );
void MoveSxHalfX86regPointerToX86reg ( int AddrReg1, int AddrReg2, int x86reg );
void MoveSxN64MemToX86regByte ( int x86reg, int AddrReg );
void MoveSxN64MemToX86regHalf ( int x86reg, int AddrReg );
void MoveSxVariableToX86regByte ( void *Variable, const char * VariableName, int x86reg );
void MoveSxVariableToX86regHalf ( void *Variable, const char * VariableName, int x86reg );
void MoveVariableDispToX86Reg ( void *Variable, const char * VariableName, int x86Reg, int AddrReg, int Multiplier );
void MoveVariableToX86reg ( void *Variable, const char * VariableName, int x86reg );
void MoveVariableToX86regByte ( void *Variable, const char * VariableName, int x86reg );
void MoveVariableToX86regHalf ( void *Variable, const char * VariableName, int x86reg );
void MoveX86PointerToX86reg ( int x86reg, int X86Pointer );
void MoveX86PointerToX86regDisp ( int x86reg, int X86Pointer, BYTE Disp );
void MoveX86regByteToN64Mem ( int x86reg, int AddrReg );
void MoveX86regByteToVariable ( int x86reg, void * Variable, const char * VariableName );
void MoveX86regByteToX86regPointer ( int x86reg, int AddrReg1, int AddrReg2 );
void MoveX86regHalfToN64Mem ( int x86reg, int AddrReg );
void MoveX86regHalfToVariable ( int x86reg, void * Variable, const char * VariableName );
void MoveX86regHalfToX86regPointer ( int x86reg, int AddrReg1, int AddrReg2 );
void MoveX86regPointerToX86reg ( int AddrReg1, int AddrReg2, int x86reg );
void MoveX86regPointerToX86regDisp8 ( int AddrReg1, int AddrReg2, int x86reg, BYTE offset );
void MoveX86regToMemory ( int x86reg, int AddrReg, DWORD Disp );
void MoveX86regToN64Mem ( int x86reg, int AddrReg );
void MoveX86regToN64MemDisp ( int x86reg, int AddrReg, BYTE Disp );
void MoveX86regToVariable ( int x86reg, void * Variable, const char * VariableName );
void MoveX86RegToX86Reg ( int Source, int Destination );
void MoveX86regToX86Pointer ( int x86reg, int X86Pointer );
void MoveX86regToX86regPointer ( int x86reg, int AddrReg1, int AddrReg2 );
void MoveZxByteX86regPointerToX86reg ( int AddrReg1, int AddrReg2, int x86reg );
void MoveZxHalfX86regPointerToX86reg ( int AddrReg1, int AddrReg2, int x86reg );
void MoveZxN64MemToX86regByte ( int x86reg, int AddrReg );
void MoveZxN64MemToX86regHalf ( int x86reg, int AddrReg );
void MoveZxVariableToX86regByte ( void *Variable, const char * VariableName, int x86reg );
void MoveZxVariableToX86regHalf ( void *Variable, const char * VariableName, int x86reg );
void MulX86reg ( int x86reg );
void NotX86Reg ( int x86Reg );
void OrConstToVariable ( DWORD Const, void * Variable, const char * VariableName );
void OrConstToX86Reg ( DWORD Const, int x86Reg );
void OrVariableToX86Reg ( void * Variable, const char * VariableName, int x86Reg );
void OrX86RegToVariable ( void * Variable, const char * VariableName, int x86Reg );
void OrX86RegToX86Reg ( int Destination, int Source );
void Popad ( void );
void Pushad ( void );
void Push ( int x86reg );
void Pop ( int x86reg );
void PushImm32 ( char * String, DWORD Value );
void Ret ( void );
void Seta ( int x86reg );
void Setae ( int x86reg );
void SetaVariable ( void * Variable, const char * VariableName );
void Setb ( int x86reg );
void SetbVariable ( void * Variable, const char * VariableName );
void Setg ( int x86reg );
void SetgVariable ( void * Variable, const char * VariableName );
void Setl ( int x86reg );
void SetlVariable ( void * Variable, const char * VariableName );
void Setz ( int x86reg );
void Setnz ( int x86reg );
void ShiftLeftDouble ( int Destination, int Source );
void ShiftLeftDoubleImmed ( int Destination, int Source, BYTE Immediate );
void ShiftLeftSign ( int x86reg );
void ShiftLeftSignImmed ( int x86reg, BYTE Immediate );
void ShiftRightDouble ( int Destination, int Source );
void ShiftRightDoubleImmed ( int Destination, int Source, BYTE Immediate );
void ShiftRightSign ( int x86reg );
void ShiftRightSignImmed ( int x86reg, BYTE Immediate );
void ShiftRightUnsign ( int x86reg );
void ShiftRightUnsignImmed ( int x86reg, BYTE Immediate );
void SbbConstFromX86Reg ( int x86Reg, DWORD Const );
void SbbVariableFromX86reg ( int x86reg, void * Variable, const char * VariableName );
void SbbX86RegToX86Reg ( int Destination, int Source );
void SubConstFromVariable ( DWORD Const, void *Variable, const char * VariableName );
void SubConstFromX86Reg ( int x86Reg, DWORD Const );
void SubVariableFromX86reg ( int x86reg, void * Variable, const char * VariableName );
void SubX86RegToX86Reg ( int Destination, int Source );
void TestConstToX86Reg ( DWORD Const, int x86reg );
void TestVariable ( DWORD Const, void * Variable, const char * VariableName );
void TestX86RegToX86Reg ( int Destination, int Source );
void XorConstToX86Reg ( int x86Reg, DWORD Const );
void XorX86RegToX86Reg ( int Source, int Destination );
void XorVariableToX86reg ( void *Variable, const char * VariableName, int x86reg );
void fpuAbs ( void );
void fpuAddDword ( void *Variable, const char * VariableName );
void fpuAddDwordRegPointer ( int x86Pointer );
void fpuAddQword ( void *Variable, const char * VariableName );
void fpuAddQwordRegPointer ( int x86Pointer );
void fpuAddReg ( int x86reg );
void fpuAddRegPop ( int * StackPos, int x86reg );
void fpuComDword ( void *Variable, const char * VariableName, BOOL Pop );
void fpuComDwordRegPointer ( int x86Pointer, BOOL Pop );
void fpuComQword ( void *Variable, const char * VariableName, BOOL Pop );
void fpuComQwordRegPointer ( int x86Pointer, BOOL Pop );
void fpuComReg ( int x86reg, BOOL Pop );
void fpuDivDword ( void *Variable, const char * VariableName );
void fpuDivDwordRegPointer ( int x86Pointer );
void fpuDivQword ( void *Variable, const char * VariableName );
void fpuDivQwordRegPointer ( int x86Pointer );
void fpuDivReg ( int Reg );
void fpuDivRegPop ( int x86reg );
void fpuExchange ( int Reg );
void fpuFree ( int Reg );
void fpuDecStack ( int * StackPos );
void fpuIncStack ( int * StackPos );
void fpuLoadControl ( void *Variable, const char * VariableName );
void fpuLoadDword ( int * StackPos, void *Variable, const char * VariableName );
void fpuLoadDwordFromX86Reg ( int * StackPos, int x86reg );
void fpuLoadDwordFromN64Mem ( int * StackPos, int x86reg );
void fpuLoadInt32bFromN64Mem ( int * StackPos, int x86reg );
void fpuLoadIntegerDword ( int * StackPos, void *Variable, const char * VariableName );
void fpuLoadIntegerDwordFromX86Reg ( int * StackPos,int x86Reg );
void fpuLoadIntegerQword ( int * StackPos, void *Variable, const char * VariableName );
void fpuLoadIntegerQwordFromX86Reg ( int * StackPos,int x86Reg );
void fpuLoadQword ( int * StackPos, void *Variable, const char * VariableName );
void fpuLoadQwordFromX86Reg ( int * StackPos, int x86Reg );
void fpuLoadQwordFromN64Mem ( int * StackPos, int x86reg );
void fpuLoadReg ( int * StackPos, int Reg );
void fpuMulDword ( void *Variable, const char * VariableName);
void fpuMulDwordRegPointer ( int x86Pointer );
void fpuMulQword ( void *Variable, const char * VariableName);
void fpuMulQwordRegPointer ( int x86Pointer );
void fpuMulReg ( int x86reg );
void fpuMulRegPop ( int x86reg );
void fpuNeg ( void );
void fpuRound ( void );
void fpuSqrt ( void );
void fpuStoreControl ( void *Variable, const char * VariableName );
void fpuStoreDword ( int * StackPos, void *Variable, const char * VariableName, BOOL pop );
void fpuStoreDwordFromX86Reg ( int * StackPos,int x86Reg, BOOL pop );
void fpuStoreDwordToN64Mem ( int * StackPos, int x86reg, BOOL Pop );
void fpuStoreIntegerDword ( int * StackPos, void *Variable, const char * VariableName, BOOL pop );
void fpuStoreIntegerDwordFromX86Reg ( int * StackPos,int x86Reg, BOOL pop );
void fpuStoreIntegerQword ( int * StackPos, void *Variable, const char * VariableName, BOOL pop );
void fpuStoreIntegerQwordFromX86Reg ( int * StackPos, int x86Reg, BOOL pop );
void fpuStoreQword ( int * StackPos, void *Variable, const char * VariableName, BOOL pop );
void fpuStoreQwordFromX86Reg ( int * StackPos, int x86Reg, BOOL pop );
void fpuStoreStatus ( void );
void fpuSubDword ( void *Variable, const char * VariableName );
void fpuSubDwordRegPointer ( int x86Pointer );
void fpuSubDwordReverse ( void *Variable, const char * VariableName );
void fpuSubQword ( void *Variable, const char * VariableName );
void fpuSubQwordRegPointer ( int x86Pointer );
void fpuSubQwordReverse ( void *Variable, const char * VariableName );
void fpuSubReg ( int x86reg );
void fpuSubRegPop ( int x86reg );
#ifdef __cplusplus
}
#endif