MCPcopy Create free account
hub / github.com/BlitterStudio/amiberry / Exception_build_stack_frame

Function Exception_build_stack_frame

src/newcpu_common.cpp:1404–1611  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1402}
1403
1404void Exception_build_stack_frame(uae_u32 oldpc, uae_u32 currpc, uae_u32 ssw, int nr, int format)
1405{
1406 int i;
1407
1408 switch (format) {
1409 case 0x0: // four word stack frame
1410 case 0x1: // throwaway four word stack frame
1411 break;
1412 case 0x2: // six word stack frame
1413 m68k_areg(regs, 7) -= 4;
1414 x_put_long(m68k_areg(regs, 7), oldpc);
1415 break;
1416 case 0x3: // floating point post-instruction stack frame (68040)
1417 m68k_areg(regs, 7) -= 4;
1418 x_put_long(m68k_areg(regs, 7), regs.fp_ea);
1419 break;
1420 case 0x4: // floating point unimplemented stack frame (68LC040, 68EC040)
1421 // or 68060 bus access fault stack frame
1422 m68k_areg(regs, 7) -= 4;
1423 x_put_long(m68k_areg(regs, 7), ssw);
1424 m68k_areg(regs, 7) -= 4;
1425 x_put_long(m68k_areg(regs, 7), oldpc);
1426 break;
1427 case 0x7: // access error stack frame (68040)
1428
1429 for (i = 3; i >= 0; i--) {
1430 // WB1D/PD0,PD1,PD2,PD3
1431 m68k_areg(regs, 7) -= 4;
1432 x_put_long(m68k_areg(regs, 7), mmu040_move16[i]);
1433 }
1434
1435 m68k_areg(regs, 7) -= 4;
1436 x_put_long(m68k_areg(regs, 7), 0); // WB1A
1437 m68k_areg(regs, 7) -= 4;
1438 x_put_long(m68k_areg(regs, 7), 0); // WB2D
1439 m68k_areg(regs, 7) -= 4;
1440 x_put_long(m68k_areg(regs, 7), regs.wb2_address); // WB2A
1441 m68k_areg(regs, 7) -= 4;
1442 x_put_long(m68k_areg(regs, 7), regs.wb3_data); // WB3D
1443 m68k_areg(regs, 7) -= 4;
1444 x_put_long(m68k_areg(regs, 7), regs.mmu_fault_addr); // WB3A
1445
1446 m68k_areg(regs, 7) -= 4;
1447 x_put_long(m68k_areg(regs, 7), regs.mmu_fault_addr); // FA
1448
1449 m68k_areg(regs, 7) -= 2;
1450 x_put_word(m68k_areg(regs, 7), 0);
1451 m68k_areg(regs, 7) -= 2;
1452 x_put_word(m68k_areg(regs, 7), regs.wb2_status);
1453 regs.wb2_status = 0;
1454 m68k_areg(regs, 7) -= 2;
1455 x_put_word(m68k_areg(regs, 7), regs.wb3_status);
1456 regs.wb3_status = 0;
1457
1458 m68k_areg(regs, 7) -= 2;
1459 x_put_word(m68k_areg(regs, 7), ssw);
1460 m68k_areg(regs, 7) -= 4;
1461 x_put_long(m68k_areg(regs, 7), regs.mmu_effective_addr);

Callers 5

doexcstack2Function · 0.85
Exception_mmu030Function · 0.85
Exception_mmuFunction · 0.85
Exception_normalFunction · 0.85

Calls 1

write_logFunction · 0.70

Tested by 1

doexcstack2Function · 0.68