23 changed files with 320 additions and 415 deletions
-
3src/citra_qt/debugger/disassembler.cpp
-
7src/core/CMakeLists.txt
-
13src/core/arm/dyncom/arm_dyncom.cpp
-
2src/core/arm/dyncom/arm_dyncom.h
-
4src/core/arm/dyncom/arm_dyncom_dec.cpp
-
4src/core/arm/dyncom/arm_dyncom_dec.h
-
12src/core/arm/dyncom/arm_dyncom_interpreter.cpp
-
2src/core/arm/dyncom/arm_dyncom_interpreter.h
-
2src/core/arm/dyncom/arm_dyncom_run.cpp
-
2src/core/arm/dyncom/arm_dyncom_run.h
-
23src/core/arm/dyncom/arm_dyncom_thumb.cpp
-
2src/core/arm/dyncom/arm_dyncom_thumb.h
-
318src/core/arm/skyeye_common/armdefs.h
-
34src/core/arm/skyeye_common/arminit.cpp
-
3src/core/arm/skyeye_common/armmmu.h
-
215src/core/arm/skyeye_common/armstate.h
-
9src/core/arm/skyeye_common/armsupp.cpp
-
40src/core/arm/skyeye_common/armsupp.h
-
12src/core/arm/skyeye_common/vfp/vfp.cpp
-
10src/core/arm/skyeye_common/vfp/vfp.h
-
4src/core/arm/skyeye_common/vfp/vfp_helper.h
-
12src/core/arm/skyeye_common/vfp/vfpdouble.cpp
-
2src/core/hle/kernel/thread.cpp
@ -1,318 +0,0 @@ |
|||||
/* armdefs.h -- ARMulator common definitions: ARM6 Instruction Emulator. |
|
||||
Copyright (C) 1994 Advanced RISC Machines Ltd. |
|
||||
|
|
||||
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 2 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, write to the Free Software |
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include <unordered_map> |
|
||||
|
|
||||
#include "common/common_types.h" |
|
||||
#include "core/arm/skyeye_common/arm_regformat.h" |
|
||||
|
|
||||
#define BITS(s, a, b) ((s << ((sizeof(s) * 8 - 1) - b)) >> (sizeof(s) * 8 - b + a - 1)) |
|
||||
#define BIT(s, n) ((s >> (n)) & 1) |
|
||||
|
|
||||
// Signal levels |
|
||||
enum { |
|
||||
LOW = 0, |
|
||||
HIGH = 1, |
|
||||
LOWHIGH = 1, |
|
||||
HIGHLOW = 2 |
|
||||
}; |
|
||||
|
|
||||
// Cache types |
|
||||
enum { |
|
||||
NONCACHE = 0, |
|
||||
DATACACHE = 1, |
|
||||
INSTCACHE = 2, |
|
||||
}; |
|
||||
|
|
||||
// Abort models |
|
||||
enum { |
|
||||
ABORT_BASE_RESTORED = 0, |
|
||||
ABORT_EARLY = 1, |
|
||||
ABORT_BASE_UPDATED = 2 |
|
||||
}; |
|
||||
|
|
||||
#define POS(i) ( (~(i)) >> 31 ) |
|
||||
#define NEG(i) ( (i) >> 31 ) |
|
||||
|
|
||||
typedef u64 ARMdword; // must be 64 bits wide |
|
||||
typedef u32 ARMword; // must be 32 bits wide |
|
||||
typedef u16 ARMhword; // must be 16 bits wide |
|
||||
typedef u8 ARMbyte; // must be 8 bits wide |
|
||||
|
|
||||
#define VFP_REG_NUM 64 |
|
||||
struct ARMul_State |
|
||||
{ |
|
||||
ARMword Emulate; // To start and stop emulation |
|
||||
|
|
||||
// Order of the following register should not be modified |
|
||||
ARMword Reg[16]; // The current register file |
|
||||
ARMword Cpsr; // The current PSR |
|
||||
ARMword Spsr_copy; |
|
||||
ARMword phys_pc; |
|
||||
ARMword Reg_usr[2]; |
|
||||
ARMword Reg_svc[2]; // R13_SVC R14_SVC |
|
||||
ARMword Reg_abort[2]; // R13_ABORT R14_ABORT |
|
||||
ARMword Reg_undef[2]; // R13 UNDEF R14 UNDEF |
|
||||
ARMword Reg_irq[2]; // R13_IRQ R14_IRQ |
|
||||
ARMword Reg_firq[7]; // R8---R14 FIRQ |
|
||||
ARMword Spsr[7]; // The exception psr's |
|
||||
ARMword Mode; // The current mode |
|
||||
ARMword Bank; // The current register bank |
|
||||
ARMword exclusive_tag; // The address for which the local monitor is in exclusive access mode |
|
||||
ARMword exclusive_state; |
|
||||
ARMword exclusive_result; |
|
||||
ARMword CP15[CP15_REGISTER_COUNT]; |
|
||||
|
|
||||
// FPSID, FPSCR, and FPEXC |
|
||||
ARMword VFP[VFP_SYSTEM_REGISTER_COUNT]; |
|
||||
// VFPv2 and VFPv3-D16 has 16 doubleword registers (D0-D16 or S0-S31). |
|
||||
// VFPv3-D32/ASIMD may have up to 32 doubleword registers (D0-D31), |
|
||||
// and only 32 singleword registers are accessible (S0-S31). |
|
||||
ARMword ExtReg[VFP_REG_NUM]; |
|
||||
/* ---- End of the ordered registers ---- */ |
|
||||
|
|
||||
ARMword NFlag, ZFlag, CFlag, VFlag, IFFlags; // Dummy flags for speed |
|
||||
unsigned int shifter_carry_out; |
|
||||
|
|
||||
// Add armv6 flags dyf:2010-08-09 |
|
||||
ARMword GEFlag, EFlag, AFlag, QFlag; |
|
||||
|
|
||||
ARMword TFlag; // Thumb state |
|
||||
|
|
||||
unsigned long long NumInstrs; // The number of instructions executed |
|
||||
unsigned NumInstrsToExecute; |
|
||||
|
|
||||
unsigned NresetSig; // Reset the processor |
|
||||
unsigned NfiqSig; |
|
||||
unsigned NirqSig; |
|
||||
|
|
||||
unsigned abortSig; |
|
||||
unsigned NtransSig; |
|
||||
unsigned bigendSig; |
|
||||
unsigned syscallSig; |
|
||||
|
|
||||
/* 2004-05-09 chy |
|
||||
---------------------------------------------------------- |
|
||||
read ARM Architecture Reference Manual |
|
||||
2.6.5 Data Abort |
|
||||
There are three Abort Model in ARM arch. |
|
||||
|
|
||||
Early Abort Model: used in some ARMv3 and earlier implementations. In this |
|
||||
model, base register wirteback occurred for LDC,LDM,STC,STM instructions, and |
|
||||
the base register was unchanged for all other instructions. (oldest) |
|
||||
|
|
||||
Base Restored Abort Model: If a Data Abort occurs in an instruction which |
|
||||
specifies base register writeback, the value in the base register is |
|
||||
unchanged. (strongarm, xscale) |
|
||||
|
|
||||
Base Updated Abort Model: If a Data Abort occurs in an instruction which |
|
||||
specifies base register writeback, the base register writeback still occurs. |
|
||||
(arm720T) |
|
||||
|
|
||||
read PART B |
|
||||
chap2 The System Control Coprocessor CP15 |
|
||||
2.4 Register1:control register |
|
||||
L(bit 6): in some ARMv3 and earlier implementations, the abort model of the |
|
||||
processor could be configured: |
|
||||
0=early Abort Model Selected(now obsolete) |
|
||||
1=Late Abort Model selceted(same as Base Updated Abort Model) |
|
||||
|
|
||||
on later processors, this bit reads as 1 and ignores writes. |
|
||||
------------------------------------------------------------- |
|
||||
So, if lateabtSig=1, then it means Late Abort Model(Base Updated Abort Model) |
|
||||
if lateabtSig=0, then it means Base Restored Abort Model |
|
||||
*/ |
|
||||
unsigned lateabtSig; |
|
||||
|
|
||||
// For differentiating ARM core emulaiton. |
|
||||
bool is_v4; // Are we emulating a v4 architecture (or higher)? |
|
||||
bool is_v5; // Are we emulating a v5 architecture? |
|
||||
bool is_v5e; // Are we emulating a v5e architecture? |
|
||||
bool is_v6; // Are we emulating a v6 architecture? |
|
||||
bool is_v7; // Are we emulating a v7 architecture? |
|
||||
|
|
||||
// ARM_ARM A2-18 |
|
||||
// 0 Base Restored Abort Model, 1 the Early Abort Model, 2 Base Updated Abort Model |
|
||||
int abort_model; |
|
||||
|
|
||||
// TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per |
|
||||
// process for our purposes), not per ARMul_State (which tracks CPU core state). |
|
||||
std::unordered_map<u32, int> instruction_cache; |
|
||||
}; |
|
||||
|
|
||||
/***************************************************************************\ |
|
||||
* Types of ARM we know about * |
|
||||
\***************************************************************************/ |
|
||||
|
|
||||
enum { |
|
||||
ARM_v4_Prop = 0x01, |
|
||||
ARM_v5_Prop = 0x02, |
|
||||
ARM_v5e_Prop = 0x04, |
|
||||
ARM_v6_Prop = 0x08, |
|
||||
ARM_v7_Prop = 0x10, |
|
||||
}; |
|
||||
|
|
||||
/***************************************************************************\ |
|
||||
* The hardware vector addresses * |
|
||||
\***************************************************************************/ |
|
||||
|
|
||||
enum { |
|
||||
ARMResetV = 0, |
|
||||
ARMUndefinedInstrV = 4, |
|
||||
ARMSWIV = 8, |
|
||||
ARMPrefetchAbortV = 12, |
|
||||
ARMDataAbortV = 16, |
|
||||
ARMAddrExceptnV = 20, |
|
||||
ARMIRQV = 24, |
|
||||
ARMFIQV = 28, |
|
||||
ARMErrorV = 32, // This is an offset, not an address! |
|
||||
|
|
||||
ARMul_ResetV = ARMResetV, |
|
||||
ARMul_UndefinedInstrV = ARMUndefinedInstrV, |
|
||||
ARMul_SWIV = ARMSWIV, |
|
||||
ARMul_PrefetchAbortV = ARMPrefetchAbortV, |
|
||||
ARMul_DataAbortV = ARMDataAbortV, |
|
||||
ARMul_AddrExceptnV = ARMAddrExceptnV, |
|
||||
ARMul_IRQV = ARMIRQV, |
|
||||
ARMul_FIQV = ARMFIQV |
|
||||
}; |
|
||||
|
|
||||
/***************************************************************************\ |
|
||||
* Mode and Bank Constants * |
|
||||
\***************************************************************************/ |
|
||||
|
|
||||
enum PrivilegeMode { |
|
||||
USER32MODE = 16, |
|
||||
FIQ32MODE = 17, |
|
||||
IRQ32MODE = 18, |
|
||||
SVC32MODE = 19, |
|
||||
ABORT32MODE = 23, |
|
||||
UNDEF32MODE = 27, |
|
||||
SYSTEM32MODE = 31 |
|
||||
}; |
|
||||
|
|
||||
enum { |
|
||||
USERBANK = 0, |
|
||||
FIQBANK = 1, |
|
||||
IRQBANK = 2, |
|
||||
SVCBANK = 3, |
|
||||
ABORTBANK = 4, |
|
||||
UNDEFBANK = 5, |
|
||||
DUMMYBANK = 6, |
|
||||
SYSTEMBANK = 7 |
|
||||
}; |
|
||||
|
|
||||
/***************************************************************************\ |
|
||||
* Definitions of things in the emulator * |
|
||||
\***************************************************************************/ |
|
||||
void ARMul_Reset(ARMul_State* state); |
|
||||
ARMul_State* ARMul_NewState(ARMul_State* state); |
|
||||
|
|
||||
/***************************************************************************\ |
|
||||
* Definitions of things in the co-processor interface * |
|
||||
\***************************************************************************/ |
|
||||
|
|
||||
enum { |
|
||||
ARMul_FIRST = 0, |
|
||||
ARMul_TRANSFER = 1, |
|
||||
ARMul_BUSY = 2, |
|
||||
ARMul_DATA = 3, |
|
||||
ARMul_INTERRUPT = 4, |
|
||||
ARMul_DONE = 0, |
|
||||
ARMul_CANT = 1, |
|
||||
ARMul_INC = 3 |
|
||||
}; |
|
||||
|
|
||||
/***************************************************************************\ |
|
||||
* Definitions of things in the host environment * |
|
||||
\***************************************************************************/ |
|
||||
|
|
||||
enum ConditionCode { |
|
||||
EQ = 0, |
|
||||
NE = 1, |
|
||||
CS = 2, |
|
||||
CC = 3, |
|
||||
MI = 4, |
|
||||
PL = 5, |
|
||||
VS = 6, |
|
||||
VC = 7, |
|
||||
HI = 8, |
|
||||
LS = 9, |
|
||||
GE = 10, |
|
||||
LT = 11, |
|
||||
GT = 12, |
|
||||
LE = 13, |
|
||||
AL = 14, |
|
||||
NV = 15, |
|
||||
}; |
|
||||
|
|
||||
// Flags for use with the APSR. |
|
||||
enum : u32 { |
|
||||
NBIT = (1U << 31U), |
|
||||
ZBIT = (1 << 30), |
|
||||
CBIT = (1 << 29), |
|
||||
VBIT = (1 << 28), |
|
||||
QBIT = (1 << 27), |
|
||||
JBIT = (1 << 24), |
|
||||
EBIT = (1 << 9), |
|
||||
ABIT = (1 << 8), |
|
||||
IBIT = (1 << 7), |
|
||||
FBIT = (1 << 6), |
|
||||
TBIT = (1 << 5), |
|
||||
|
|
||||
// Masks for groups of bits in the APSR. |
|
||||
MODEBITS = 0x1F, |
|
||||
INTBITS = 0x1C0, |
|
||||
}; |
|
||||
|
|
||||
// Values for Emulate. |
|
||||
enum { |
|
||||
STOP = 0, // Stop |
|
||||
CHANGEMODE = 1, // Change mode |
|
||||
ONCE = 2, // Execute just one iteration |
|
||||
RUN = 3 // Continuous execution |
|
||||
}; |
|
||||
|
|
||||
|
|
||||
bool AddOverflow(ARMword, ARMword, ARMword); |
|
||||
bool SubOverflow(ARMword, ARMword, ARMword); |
|
||||
|
|
||||
void ARMul_SelectProcessor(ARMul_State*, unsigned); |
|
||||
|
|
||||
u32 AddWithCarry(u32, u32, u32, bool*, bool*); |
|
||||
bool ARMul_AddOverflowQ(ARMword, ARMword); |
|
||||
|
|
||||
u8 ARMul_SignedSaturatedAdd8(u8, u8); |
|
||||
u8 ARMul_SignedSaturatedSub8(u8, u8); |
|
||||
u16 ARMul_SignedSaturatedAdd16(u16, u16); |
|
||||
u16 ARMul_SignedSaturatedSub16(u16, u16); |
|
||||
|
|
||||
u8 ARMul_UnsignedSaturatedAdd8(u8, u8); |
|
||||
u16 ARMul_UnsignedSaturatedAdd16(u16, u16); |
|
||||
u8 ARMul_UnsignedSaturatedSub8(u8, u8); |
|
||||
u16 ARMul_UnsignedSaturatedSub16(u16, u16); |
|
||||
u8 ARMul_UnsignedAbsoluteDifference(u8, u8); |
|
||||
u32 ARMul_SignedSatQ(s32, u8, bool*); |
|
||||
u32 ARMul_UnsignedSatQ(s32, u8, bool*); |
|
||||
|
|
||||
bool InBigEndianMode(ARMul_State*); |
|
||||
bool InAPrivilegedMode(ARMul_State*); |
|
||||
|
|
||||
u32 ReadCP15Register(ARMul_State* cpu, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2); |
|
||||
void WriteCP15Register(ARMul_State* cpu, u32 value, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2); |
|
||||
@ -0,0 +1,215 @@ |
|||||
|
/* armdefs.h -- ARMulator common definitions: ARM6 Instruction Emulator. |
||||
|
Copyright (C) 1994 Advanced RISC Machines Ltd. |
||||
|
|
||||
|
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 2 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, write to the Free Software |
||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <unordered_map> |
||||
|
|
||||
|
#include "common/common_types.h" |
||||
|
#include "core/arm/skyeye_common/arm_regformat.h" |
||||
|
|
||||
|
// Signal levels |
||||
|
enum { |
||||
|
LOW = 0, |
||||
|
HIGH = 1, |
||||
|
LOWHIGH = 1, |
||||
|
HIGHLOW = 2 |
||||
|
}; |
||||
|
|
||||
|
// Cache types |
||||
|
enum { |
||||
|
NONCACHE = 0, |
||||
|
DATACACHE = 1, |
||||
|
INSTCACHE = 2, |
||||
|
}; |
||||
|
|
||||
|
#define VFP_REG_NUM 64 |
||||
|
struct ARMul_State |
||||
|
{ |
||||
|
u32 Emulate; // To start and stop emulation |
||||
|
|
||||
|
// Order of the following register should not be modified |
||||
|
u32 Reg[16]; // The current register file |
||||
|
u32 Cpsr; // The current PSR |
||||
|
u32 Spsr_copy; |
||||
|
u32 phys_pc; |
||||
|
u32 Reg_usr[2]; |
||||
|
u32 Reg_svc[2]; // R13_SVC R14_SVC |
||||
|
u32 Reg_abort[2]; // R13_ABORT R14_ABORT |
||||
|
u32 Reg_undef[2]; // R13 UNDEF R14 UNDEF |
||||
|
u32 Reg_irq[2]; // R13_IRQ R14_IRQ |
||||
|
u32 Reg_firq[7]; // R8---R14 FIRQ |
||||
|
u32 Spsr[7]; // The exception psr's |
||||
|
u32 Mode; // The current mode |
||||
|
u32 Bank; // The current register bank |
||||
|
u32 exclusive_tag; // The address for which the local monitor is in exclusive access mode |
||||
|
u32 exclusive_state; |
||||
|
u32 exclusive_result; |
||||
|
u32 CP15[CP15_REGISTER_COUNT]; |
||||
|
|
||||
|
// FPSID, FPSCR, and FPEXC |
||||
|
u32 VFP[VFP_SYSTEM_REGISTER_COUNT]; |
||||
|
// VFPv2 and VFPv3-D16 has 16 doubleword registers (D0-D16 or S0-S31). |
||||
|
// VFPv3-D32/ASIMD may have up to 32 doubleword registers (D0-D31), |
||||
|
// and only 32 singleword registers are accessible (S0-S31). |
||||
|
u32 ExtReg[VFP_REG_NUM]; |
||||
|
/* ---- End of the ordered registers ---- */ |
||||
|
|
||||
|
u32 NFlag, ZFlag, CFlag, VFlag, IFFlags; // Dummy flags for speed |
||||
|
unsigned int shifter_carry_out; |
||||
|
|
||||
|
// Add armv6 flags dyf:2010-08-09 |
||||
|
u32 GEFlag, EFlag, AFlag, QFlag; |
||||
|
|
||||
|
u32 TFlag; // Thumb state |
||||
|
|
||||
|
unsigned long long NumInstrs; // The number of instructions executed |
||||
|
unsigned NumInstrsToExecute; |
||||
|
|
||||
|
unsigned NresetSig; // Reset the processor |
||||
|
unsigned NfiqSig; |
||||
|
unsigned NirqSig; |
||||
|
|
||||
|
unsigned abortSig; |
||||
|
unsigned NtransSig; |
||||
|
unsigned bigendSig; |
||||
|
unsigned syscallSig; |
||||
|
|
||||
|
// TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per |
||||
|
// process for our purposes), not per ARMul_State (which tracks CPU core state). |
||||
|
std::unordered_map<u32, int> instruction_cache; |
||||
|
}; |
||||
|
|
||||
|
/***************************************************************************\ |
||||
|
* The hardware vector addresses * |
||||
|
\***************************************************************************/ |
||||
|
|
||||
|
enum { |
||||
|
ARMResetV = 0, |
||||
|
ARMUndefinedInstrV = 4, |
||||
|
ARMSWIV = 8, |
||||
|
ARMPrefetchAbortV = 12, |
||||
|
ARMDataAbortV = 16, |
||||
|
ARMAddrExceptnV = 20, |
||||
|
ARMIRQV = 24, |
||||
|
ARMFIQV = 28, |
||||
|
ARMErrorV = 32, // This is an offset, not an address! |
||||
|
|
||||
|
ARMul_ResetV = ARMResetV, |
||||
|
ARMul_UndefinedInstrV = ARMUndefinedInstrV, |
||||
|
ARMul_SWIV = ARMSWIV, |
||||
|
ARMul_PrefetchAbortV = ARMPrefetchAbortV, |
||||
|
ARMul_DataAbortV = ARMDataAbortV, |
||||
|
ARMul_AddrExceptnV = ARMAddrExceptnV, |
||||
|
ARMul_IRQV = ARMIRQV, |
||||
|
ARMul_FIQV = ARMFIQV |
||||
|
}; |
||||
|
|
||||
|
/***************************************************************************\ |
||||
|
* Mode and Bank Constants * |
||||
|
\***************************************************************************/ |
||||
|
|
||||
|
enum PrivilegeMode { |
||||
|
USER32MODE = 16, |
||||
|
FIQ32MODE = 17, |
||||
|
IRQ32MODE = 18, |
||||
|
SVC32MODE = 19, |
||||
|
ABORT32MODE = 23, |
||||
|
UNDEF32MODE = 27, |
||||
|
SYSTEM32MODE = 31 |
||||
|
}; |
||||
|
|
||||
|
enum { |
||||
|
USERBANK = 0, |
||||
|
FIQBANK = 1, |
||||
|
IRQBANK = 2, |
||||
|
SVCBANK = 3, |
||||
|
ABORTBANK = 4, |
||||
|
UNDEFBANK = 5, |
||||
|
DUMMYBANK = 6, |
||||
|
SYSTEMBANK = 7 |
||||
|
}; |
||||
|
|
||||
|
/***************************************************************************\ |
||||
|
* Definitions of things in the emulator * |
||||
|
\***************************************************************************/ |
||||
|
void ARMul_Reset(ARMul_State* state); |
||||
|
|
||||
|
/***************************************************************************\ |
||||
|
* Definitions of things in the co-processor interface * |
||||
|
\***************************************************************************/ |
||||
|
|
||||
|
enum { |
||||
|
ARMul_FIRST = 0, |
||||
|
ARMul_TRANSFER = 1, |
||||
|
ARMul_BUSY = 2, |
||||
|
ARMul_DATA = 3, |
||||
|
ARMul_INTERRUPT = 4, |
||||
|
ARMul_DONE = 0, |
||||
|
ARMul_CANT = 1, |
||||
|
ARMul_INC = 3 |
||||
|
}; |
||||
|
|
||||
|
/***************************************************************************\ |
||||
|
* Definitions of things in the host environment * |
||||
|
\***************************************************************************/ |
||||
|
|
||||
|
enum ConditionCode { |
||||
|
EQ = 0, |
||||
|
NE = 1, |
||||
|
CS = 2, |
||||
|
CC = 3, |
||||
|
MI = 4, |
||||
|
PL = 5, |
||||
|
VS = 6, |
||||
|
VC = 7, |
||||
|
HI = 8, |
||||
|
LS = 9, |
||||
|
GE = 10, |
||||
|
LT = 11, |
||||
|
GT = 12, |
||||
|
LE = 13, |
||||
|
AL = 14, |
||||
|
NV = 15, |
||||
|
}; |
||||
|
|
||||
|
// Flags for use with the APSR. |
||||
|
enum : u32 { |
||||
|
NBIT = (1U << 31U), |
||||
|
ZBIT = (1 << 30), |
||||
|
CBIT = (1 << 29), |
||||
|
VBIT = (1 << 28), |
||||
|
QBIT = (1 << 27), |
||||
|
JBIT = (1 << 24), |
||||
|
EBIT = (1 << 9), |
||||
|
ABIT = (1 << 8), |
||||
|
IBIT = (1 << 7), |
||||
|
FBIT = (1 << 6), |
||||
|
TBIT = (1 << 5), |
||||
|
|
||||
|
// Masks for groups of bits in the APSR. |
||||
|
MODEBITS = 0x1F, |
||||
|
INTBITS = 0x1C0, |
||||
|
}; |
||||
|
|
||||
|
// Values for Emulate. |
||||
|
enum { |
||||
|
STOP = 0, // Stop |
||||
|
CHANGEMODE = 1, // Change mode |
||||
|
ONCE = 2, // Execute just one iteration |
||||
|
RUN = 3 // Continuous execution |
||||
|
}; |
||||
@ -0,0 +1,40 @@ |
|||||
|
// Copyright 2014 Citra Emulator Project |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "common/common_types.h" |
||||
|
|
||||
|
struct ARMul_State; |
||||
|
|
||||
|
#define BITS(s, a, b) ((s << ((sizeof(s) * 8 - 1) - b)) >> (sizeof(s) * 8 - b + a - 1)) |
||||
|
#define BIT(s, n) ((s >> (n)) & 1) |
||||
|
|
||||
|
#define POS(i) ( (~(i)) >> 31 ) |
||||
|
#define NEG(i) ( (i) >> 31 ) |
||||
|
|
||||
|
bool AddOverflow(u32, u32, u32); |
||||
|
bool SubOverflow(u32, u32, u32); |
||||
|
|
||||
|
u32 AddWithCarry(u32, u32, u32, bool*, bool*); |
||||
|
bool ARMul_AddOverflowQ(u32, u32); |
||||
|
|
||||
|
u8 ARMul_SignedSaturatedAdd8(u8, u8); |
||||
|
u8 ARMul_SignedSaturatedSub8(u8, u8); |
||||
|
u16 ARMul_SignedSaturatedAdd16(u16, u16); |
||||
|
u16 ARMul_SignedSaturatedSub16(u16, u16); |
||||
|
|
||||
|
u8 ARMul_UnsignedSaturatedAdd8(u8, u8); |
||||
|
u16 ARMul_UnsignedSaturatedAdd16(u16, u16); |
||||
|
u8 ARMul_UnsignedSaturatedSub8(u8, u8); |
||||
|
u16 ARMul_UnsignedSaturatedSub16(u16, u16); |
||||
|
u8 ARMul_UnsignedAbsoluteDifference(u8, u8); |
||||
|
u32 ARMul_SignedSatQ(s32, u8, bool*); |
||||
|
u32 ARMul_UnsignedSatQ(s32, u8, bool*); |
||||
|
|
||||
|
bool InBigEndianMode(ARMul_State*); |
||||
|
bool InAPrivilegedMode(ARMul_State*); |
||||
|
|
||||
|
u32 ReadCP15Register(ARMul_State* cpu, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2); |
||||
|
void WriteCP15Register(ARMul_State* cpu, u32 value, u32 crn, u32 opcode_1, u32 crm, u32 opcode_2); |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue