arm_dyncom_run.cpp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2012 Michael Kang, 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/arm/skyeye_common/armdefs.h"
  5. void switch_mode(arm_core_t *core, uint32_t mode) {
  6. if (core->Mode == mode)
  7. return;
  8. if (mode != USERBANK) {
  9. switch (core->Mode) {
  10. case SYSTEM32MODE: // Shares registers with user mode
  11. case USER32MODE:
  12. core->Reg_usr[0] = core->Reg[13];
  13. core->Reg_usr[1] = core->Reg[14];
  14. break;
  15. case IRQ32MODE:
  16. core->Reg_irq[0] = core->Reg[13];
  17. core->Reg_irq[1] = core->Reg[14];
  18. core->Spsr[IRQBANK] = core->Spsr_copy;
  19. break;
  20. case SVC32MODE:
  21. core->Reg_svc[0] = core->Reg[13];
  22. core->Reg_svc[1] = core->Reg[14];
  23. core->Spsr[SVCBANK] = core->Spsr_copy;
  24. break;
  25. case ABORT32MODE:
  26. core->Reg_abort[0] = core->Reg[13];
  27. core->Reg_abort[1] = core->Reg[14];
  28. core->Spsr[ABORTBANK] = core->Spsr_copy;
  29. break;
  30. case UNDEF32MODE:
  31. core->Reg_undef[0] = core->Reg[13];
  32. core->Reg_undef[1] = core->Reg[14];
  33. core->Spsr[UNDEFBANK] = core->Spsr_copy;
  34. break;
  35. case FIQ32MODE:
  36. core->Reg_firq[0] = core->Reg[13];
  37. core->Reg_firq[1] = core->Reg[14];
  38. core->Spsr[FIQBANK] = core->Spsr_copy;
  39. break;
  40. }
  41. switch (mode) {
  42. case USER32MODE:
  43. core->Reg[13] = core->Reg_usr[0];
  44. core->Reg[14] = core->Reg_usr[1];
  45. core->Bank = USERBANK;
  46. break;
  47. case IRQ32MODE:
  48. core->Reg[13] = core->Reg_irq[0];
  49. core->Reg[14] = core->Reg_irq[1];
  50. core->Spsr_copy = core->Spsr[IRQBANK];
  51. core->Bank = IRQBANK;
  52. break;
  53. case SVC32MODE:
  54. core->Reg[13] = core->Reg_svc[0];
  55. core->Reg[14] = core->Reg_svc[1];
  56. core->Spsr_copy = core->Spsr[SVCBANK];
  57. core->Bank = SVCBANK;
  58. break;
  59. case ABORT32MODE:
  60. core->Reg[13] = core->Reg_abort[0];
  61. core->Reg[14] = core->Reg_abort[1];
  62. core->Spsr_copy = core->Spsr[ABORTBANK];
  63. core->Bank = ABORTBANK;
  64. break;
  65. case UNDEF32MODE:
  66. core->Reg[13] = core->Reg_undef[0];
  67. core->Reg[14] = core->Reg_undef[1];
  68. core->Spsr_copy = core->Spsr[UNDEFBANK];
  69. core->Bank = UNDEFBANK;
  70. break;
  71. case FIQ32MODE:
  72. core->Reg[13] = core->Reg_firq[0];
  73. core->Reg[14] = core->Reg_firq[1];
  74. core->Spsr_copy = core->Spsr[FIQBANK];
  75. core->Bank = FIQBANK;
  76. break;
  77. case SYSTEM32MODE: // Shares registers with user mode.
  78. core->Reg[13] = core->Reg_usr[0];
  79. core->Reg[14] = core->Reg_usr[1];
  80. core->Bank = SYSTEMBANK;
  81. break;
  82. }
  83. // Set the mode bits in the APSR
  84. core->Cpsr = (core->Cpsr & ~core->Mode) | mode;
  85. core->Mode = mode;
  86. }
  87. }