arm_dyncom_run.cpp 3.1 KB

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