mirror of
https://github.com/kanjitalk755/macemu.git
synced 2024-12-26 08:32:20 +00:00
Match Linux/ppc native version better: jump to ROM with EmulatorData in r4,
preserve CR & XER registers on EmulOp.
This commit is contained in:
parent
561046449a
commit
97ce4fdc75
@ -127,9 +127,11 @@ public:
|
|||||||
// Constructor
|
// Constructor
|
||||||
sheepshaver_cpu();
|
sheepshaver_cpu();
|
||||||
|
|
||||||
// Condition Register accessors
|
// CR & XER accessors
|
||||||
uint32 get_cr() const { return cr().get(); }
|
uint32 get_cr() const { return cr().get(); }
|
||||||
void set_cr(uint32 v) { cr().set(v); }
|
void set_cr(uint32 v) { cr().set(v); }
|
||||||
|
uint32 get_xer() const { return xer().get(); }
|
||||||
|
void set_xer(uint32 v) { xer().set(v); }
|
||||||
|
|
||||||
// Execute 68k routine
|
// Execute 68k routine
|
||||||
void execute_68k(uint32 entry, M68kRegisters *r);
|
void execute_68k(uint32 entry, M68kRegisters *r);
|
||||||
@ -241,7 +243,11 @@ void sheepshaver_cpu::execute_sheep(uint32 opcode)
|
|||||||
for (int i = 0; i < 7; i++)
|
for (int i = 0; i < 7; i++)
|
||||||
r68.a[i] = gpr(16 + i);
|
r68.a[i] = gpr(16 + i);
|
||||||
r68.a[7] = gpr(1);
|
r68.a[7] = gpr(1);
|
||||||
|
uint32 saved_cr = get_cr() & CR_field<2>::mask();
|
||||||
|
uint32 saved_xer = get_xer();
|
||||||
EmulOp(&r68, gpr(24), EMUL_OP_field::extract(opcode) - 3);
|
EmulOp(&r68, gpr(24), EMUL_OP_field::extract(opcode) - 3);
|
||||||
|
set_cr(saved_cr);
|
||||||
|
set_xer(saved_xer);
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
gpr(8 + i) = r68.d[i];
|
gpr(8 + i) = r68.d[i];
|
||||||
for (int i = 0; i < 7; i++)
|
for (int i = 0; i < 7; i++)
|
||||||
@ -623,6 +629,7 @@ void init_emul_ppc(void)
|
|||||||
// Initialize main CPU emulator
|
// Initialize main CPU emulator
|
||||||
main_cpu = new sheepshaver_cpu();
|
main_cpu = new sheepshaver_cpu();
|
||||||
main_cpu->set_register(powerpc_registers::GPR(3), any_register((uint32)ROM_BASE + 0x30d000));
|
main_cpu->set_register(powerpc_registers::GPR(3), any_register((uint32)ROM_BASE + 0x30d000));
|
||||||
|
main_cpu->set_register(powerpc_registers::GPR(4), any_register(KernelDataAddr + 0x1000));
|
||||||
WriteMacInt32(XLM_RUN_MODE, MODE_68K);
|
WriteMacInt32(XLM_RUN_MODE, MODE_68K);
|
||||||
|
|
||||||
#if MULTICORE_CPU
|
#if MULTICORE_CPU
|
||||||
@ -687,7 +694,7 @@ void exit_emul_ppc(void)
|
|||||||
void emul_ppc(uint32 entry)
|
void emul_ppc(uint32 entry)
|
||||||
{
|
{
|
||||||
current_cpu = main_cpu;
|
current_cpu = main_cpu;
|
||||||
#if DEBUG
|
#if 0
|
||||||
current_cpu->start_log();
|
current_cpu->start_log();
|
||||||
#endif
|
#endif
|
||||||
// start emulation loop and enable code translation or caching
|
// start emulation loop and enable code translation or caching
|
||||||
|
Loading…
Reference in New Issue
Block a user