| 1402 | } |
| 1403 | |
| 1404 | void 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); |