mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
99 lines
1.4 KiB
C++
99 lines
1.4 KiB
C++
#pragma once
|
|
#include "Emu/CPU/CPUThread.h"
|
|
|
|
class ARMv7Thread : public CPUThread
|
|
{
|
|
public:
|
|
ARMv7Thread();
|
|
|
|
union
|
|
{
|
|
u32 GPR[15];
|
|
|
|
struct
|
|
{
|
|
u32 pad[13];
|
|
|
|
union
|
|
{
|
|
u32 SP;
|
|
|
|
struct { u16 SP_main, SP_process; };
|
|
};
|
|
|
|
u32 LR;
|
|
};
|
|
};
|
|
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
u32 N : 1; //Negative condition code flag
|
|
u32 Z : 1; //Zero condition code flag
|
|
u32 C : 1; //Carry condition code flag
|
|
u32 V : 1; //Overflow condition code flag
|
|
u32 Q : 1; //Set to 1 if an SSAT or USAT instruction changes (saturates) the input value for the signed or unsigned range of the result
|
|
u32 : 27;
|
|
};
|
|
|
|
u32 APSR;
|
|
} APSR;
|
|
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
u32 : 24;
|
|
u32 exception : 8;
|
|
};
|
|
|
|
u32 IPSR;
|
|
} IPSR;
|
|
|
|
void write_gpr(u8 n, u32 value)
|
|
{
|
|
assert(n < 16);
|
|
|
|
if(n < 15)
|
|
{
|
|
GPR[n] = value;
|
|
}
|
|
else
|
|
{
|
|
SetBranch(value);
|
|
}
|
|
}
|
|
|
|
u32 read_gpr(u8 n)
|
|
{
|
|
assert(n < 16);
|
|
|
|
if(n < 15)
|
|
{
|
|
return GPR[n];
|
|
}
|
|
|
|
return PC;
|
|
}
|
|
|
|
public:
|
|
virtual void InitRegs();
|
|
virtual void InitStack();
|
|
virtual u64 GetFreeStackSize() const;
|
|
virtual void SetArg(const uint pos, const u64 arg);
|
|
|
|
public:
|
|
virtual std::string RegsToString();
|
|
virtual std::string ReadRegString(const std::string& reg);
|
|
virtual bool WriteRegString(const std::string& reg, std::string value);
|
|
|
|
protected:
|
|
virtual void DoReset();
|
|
virtual void DoRun();
|
|
virtual void DoPause();
|
|
virtual void DoResume();
|
|
virtual void DoStop();
|
|
|
|
virtual void DoCode();
|
|
}; |