| 330 |
uint32 saved_ctr= ctr(); |
uint32 saved_ctr= ctr(); |
| 331 |
|
|
| 332 |
// Create MacOS stack frame |
// Create MacOS stack frame |
| 333 |
|
// FIXME: make sure MacOS doesn't expect PPC registers to live on top |
| 334 |
uint32 sp = gpr(1); |
uint32 sp = gpr(1); |
| 335 |
gpr(1) -= 56 + 19*4 + 18*8; |
gpr(1) -= 56; |
| 336 |
WriteMacInt32(gpr(1), sp); |
WriteMacInt32(gpr(1), sp); |
| 337 |
|
|
| 338 |
// Save PowerPC registers |
// Save PowerPC registers |
| 339 |
for (int i = 13; i < 32; i++) |
uint32 saved_GPRs[19]; |
| 340 |
WriteMacInt32(gpr(1) + 56 + i*4, gpr(i)); |
memcpy(&saved_GPRs[0], &gpr(13), sizeof(uint32)*(32-13)); |
| 341 |
#if SAVE_FP_EXEC_68K |
#if SAVE_FP_EXEC_68K |
| 342 |
memcpy(Mac2HostAddr(gpr(1)+56+19*4), &fpr(14), sizeof(double)*(32-14)); |
double saved_FPRs[18]; |
| 343 |
|
memcpy(&saved_FPRs[0], &fpr(14), sizeof(double)*(32-14)); |
| 344 |
#endif |
#endif |
| 345 |
|
|
| 346 |
// Setup registers for 68k emulator |
// Setup registers for 68k emulator |
| 387 |
r->a[i] = gpr(16 + i); |
r->a[i] = gpr(16 + i); |
| 388 |
|
|
| 389 |
// Restore PowerPC registers |
// Restore PowerPC registers |
| 390 |
for (int i = 13; i < 32; i++) |
memcpy(&gpr(13), &saved_GPRs[0], sizeof(uint32)*(32-13)); |
|
gpr(i) = ReadMacInt32(gpr(1) + 56 + i*4); |
|
| 391 |
#if SAVE_FP_EXEC_68K |
#if SAVE_FP_EXEC_68K |
| 392 |
memcpy(&fpr(14), Mac2HostAddr(gpr(1)+56+19*4), sizeof(double)*(32-14)); |
memcpy(&fpr(14), &saved_FPRs[0], sizeof(double)*(32-14)); |
| 393 |
#endif |
#endif |
| 394 |
|
|
| 395 |
// Cleanup stack |
// Cleanup stack |
| 396 |
gpr(1) += 56 + 19*4 + 18*8; |
gpr(1) += 56; |
| 397 |
|
|
| 398 |
// Restore program counters and branch registers |
// Restore program counters and branch registers |
| 399 |
pc() = saved_pc; |
pc() = saved_pc; |
| 450 |
{ |
{ |
| 451 |
// Save branch registers |
// Save branch registers |
| 452 |
uint32 saved_lr = lr(); |
uint32 saved_lr = lr(); |
|
uint32 saved_ctr= ctr(); |
|
| 453 |
|
|
| 454 |
const uint32 trampoline[] = { htonl(POWERPC_EMUL_OP | 1) }; |
const uint32 trampoline[] = { htonl(POWERPC_EMUL_OP | 1) }; |
|
|
|
| 455 |
lr() = (uint32)trampoline; |
lr() = (uint32)trampoline; |
| 456 |
ctr()= entry; |
|
| 457 |
execute(entry); |
execute(entry); |
| 458 |
|
|
| 459 |
// Restore branch registers |
// Restore branch registers |
| 460 |
lr() = saved_lr; |
lr() = saved_lr; |
|
ctr()= saved_ctr; |
|
| 461 |
} |
} |
| 462 |
|
|
| 463 |
// Resource Manager thunk |
// Resource Manager thunk |