mirror of https://github.com/stella-emu/stella.git
Updated thumbulator code from latest in repo.
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@3290 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
b02059dc5f
commit
983c6361f2
|
@ -18,6 +18,11 @@
|
||||||
character corresponding to the '`' key would be output in the
|
character corresponding to the '`' key would be output in the
|
||||||
prompt area.
|
prompt area.
|
||||||
|
|
||||||
|
* Updated DPC+ Thumb ARM emulation code to latest from David Welch.
|
||||||
|
In particular, this fixes incorrect handling of the V flag when
|
||||||
|
adding and subtracting, but also fixes compile-time warnings that
|
||||||
|
I couldn't get rid of before.
|
||||||
|
|
||||||
-Have fun!
|
-Have fun!
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -37,30 +37,10 @@
|
||||||
#define ROMSIZE (ROMADDMASK+1)
|
#define ROMSIZE (ROMADDMASK+1)
|
||||||
#define RAMSIZE (RAMADDMASK+1)
|
#define RAMSIZE (RAMADDMASK+1)
|
||||||
|
|
||||||
//0b10000 User PC, R14 to R0, CPSR
|
|
||||||
//0b10001 FIQ PC, R14_fiq to R8_fiq, R7 to R0, CPSR, SPSR_fiq
|
|
||||||
//0b10010 IRQ PC, R14_irq, R13_irq, R12 to R0, CPSR, SPSR_irq
|
|
||||||
//0b10011 Supervisor PC, R14_svc, R13_svc, R12 to R0, CPSR, SPSR_svc
|
|
||||||
//0b10111 Abort PC, R14_abt, R13_abt, R12 to R0, CPSR, SPSR_abt
|
|
||||||
//0b11011 Undefined PC, R14_und, R13_und, R12 to R0, CPSR, SPSR_und
|
|
||||||
//0b11111 System
|
|
||||||
|
|
||||||
#define MODE_USR 0x10
|
|
||||||
#define MODE_FIQ 0x11
|
|
||||||
#define MODE_IRQ 0x12
|
|
||||||
#define MODE_SVC 0x13
|
|
||||||
#define MODE_ABT 0x17
|
|
||||||
#define MODE_UND 0x1B
|
|
||||||
#define MODE_SYS 0x1F
|
|
||||||
|
|
||||||
#define CPSR_T (1<<5)
|
|
||||||
#define CPSR_F (1<<6)
|
|
||||||
#define CPSR_I (1<<7)
|
|
||||||
#define CPSR_N (1<<31)
|
#define CPSR_N (1<<31)
|
||||||
#define CPSR_Z (1<<30)
|
#define CPSR_Z (1<<30)
|
||||||
#define CPSR_C (1<<29)
|
#define CPSR_C (1<<29)
|
||||||
#define CPSR_V (1<<28)
|
#define CPSR_V (1<<28)
|
||||||
#define CPSR_Q (1<<27)
|
|
||||||
|
|
||||||
class Thumbulator
|
class Thumbulator
|
||||||
{
|
{
|
||||||
|
@ -92,22 +72,21 @@ class Thumbulator
|
||||||
static void trapFatalErrors(bool enable) { trapOnFatal = enable; }
|
static void trapFatalErrors(bool enable) { trapOnFatal = enable; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uInt32 read_register ( uInt32 reg );
|
uInt32 read_register(uInt32 reg);
|
||||||
uInt32 write_register ( uInt32 reg, uInt32 data );
|
void write_register(uInt32 reg, uInt32 data);
|
||||||
uInt32 fetch16 ( uInt32 addr );
|
uInt32 fetch16(uInt32 addr);
|
||||||
//uInt32 fetch32 ( uInt32 addr );
|
uInt32 fetch32(uInt32 addr);
|
||||||
uInt32 read16 ( uInt32 addr );
|
uInt32 read16(uInt32 addr);
|
||||||
uInt32 read32 ( uInt32 );
|
uInt32 read32(uInt32 addr);
|
||||||
void write16 ( uInt32 addr, uInt32 data );
|
void write16(uInt32 addr, uInt32 data);
|
||||||
void write32 ( uInt32 addr, uInt32 data );
|
void write32(uInt32 addr, uInt32 data);
|
||||||
|
|
||||||
void do_zflag ( uInt32 x );
|
void do_zflag(uInt32 x);
|
||||||
void do_nflag ( uInt32 x );
|
void do_nflag(uInt32 x);
|
||||||
void do_cflag ( uInt32 a, uInt32 b, uInt32 c );
|
void do_cflag(uInt32 a, uInt32 b, uInt32 c);
|
||||||
void do_sub_vflag ( uInt32 a, uInt32 b, uInt32 c );
|
void do_vflag(uInt32 a, uInt32 b, uInt32 c);
|
||||||
void do_add_vflag ( uInt32 a, uInt32 b, uInt32 c );
|
void do_cflag_bit(uInt32 x);
|
||||||
void do_cflag_bit ( uInt32 x );
|
void do_vflag_bit(uInt32 x);
|
||||||
void do_vflag_bit ( uInt32 x );
|
|
||||||
|
|
||||||
// Throw a runtime_error exception containing an error referencing the
|
// Throw a runtime_error exception containing an error referencing the
|
||||||
// given message and variables
|
// given message and variables
|
||||||
|
@ -115,31 +94,20 @@ class Thumbulator
|
||||||
int fatalError(const char* opcode, uInt32 v1, const char* msg);
|
int fatalError(const char* opcode, uInt32 v1, const char* msg);
|
||||||
int fatalError(const char* opcode, uInt32 v1, uInt32 v2, const char* msg);
|
int fatalError(const char* opcode, uInt32 v1, uInt32 v2, const char* msg);
|
||||||
|
|
||||||
void dump_counters ( void );
|
void dump_counters();
|
||||||
void dump_regs( void );
|
void dump_regs();
|
||||||
int execute ( void );
|
int execute();
|
||||||
int reset ( void );
|
int reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const uInt16* rom;
|
const uInt16* rom;
|
||||||
uInt16* ram;
|
uInt16* ram;
|
||||||
//Int32 copydata;
|
|
||||||
|
|
||||||
uInt32 halfadd;
|
uInt32 reg_norm[16]; // normal execution mode, do not have a thread mode
|
||||||
uInt32 cpsr;
|
uInt32 cpsr, mamcr;
|
||||||
//uInt32 reg_usr[16]; //User mode
|
bool handler_mode;
|
||||||
uInt32 reg_sys[16]; //System mode
|
uInt32 systick_ctrl, systick_reload, systick_count, systick_calibrate;
|
||||||
uInt32 reg_svc[16]; //Supervisor mode
|
uInt64 instructions, fetches, reads, writes, systick_ints;
|
||||||
//uInt32 reg_abt[16]; //Abort mode
|
|
||||||
//uInt32 reg_und[16]; //Undefined mode
|
|
||||||
//uInt32 reg_irq[16]; //Interrupt mode
|
|
||||||
//uInt32 reg_fiq[16]; //Fast Interrupt mode
|
|
||||||
uInt32 mamcr;
|
|
||||||
|
|
||||||
uInt64 instructions;
|
|
||||||
uInt64 fetches;
|
|
||||||
uInt64 reads;
|
|
||||||
uInt64 writes;
|
|
||||||
|
|
||||||
ostringstream statusMsg;
|
ostringstream statusMsg;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue