Advertisement
EliteAnax17

Untitled

May 18th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.04 KB | None | 0 0
  1. #include "global.h"
  2. #include "main.h"
  3. #include "sound.h"
  4. #include "songs.h"
  5. #include "task.h"
  6. #include "sprite.h"
  7. #include "palette.h"
  8. #include "menu.h"
  9. #include "string_util.h"
  10.  
  11. extern void WaitForVBlank(void);
  12.  
  13. extern u8 gUnknown_0839F63C[];
  14. extern u8 gUnknown_0839F5FC[]; //palette
  15.  
  16. // exceptions
  17. enum
  18. {
  19. TASK_OVERFLOW
  20. };
  21.  
  22. struct CrashExceptionInfo
  23. {
  24. u8 *string;
  25. };
  26.  
  27. struct CrashScreen
  28. {
  29. u32 registers[13]; // r0-r12
  30. void (* returnPointer)(void); // lr
  31. u32 *stackPointer; // sp
  32. u32 statusRegister;
  33. u32 stackTrace[7]; // last contents of sp
  34. u8 exception;
  35. };
  36.  
  37. const u8 gCrashScreenHeaderText[] = _("An error occured - give this to the devs.");
  38. const u8 gCrashScreenRegisterR0[] = _("r0: ");
  39. const u8 gCrashScreenRegisterR1[] = _("r1: ");
  40. const u8 gCrashScreenRegisterR2[] = _("r2: ");
  41. const u8 gCrashScreenRegisterR3[] = _("r3: ");
  42. const u8 gCrashScreenRegisterR4[] = _("r4: ");
  43. const u8 gCrashScreenRegisterR5[] = _("r5: ");
  44. const u8 gCrashScreenRegisterR6[] = _("r6: ");
  45. const u8 gCrashScreenRegisterR7[] = _("r7: ");
  46. const u8 gCrashScreenRegisterR8[] = _("r8: ");
  47. const u8 gCrashScreenRegisterR9[] = _("r9: ");
  48. const u8 gCrashScreenRegisterR10[] = _("r10: ");
  49. const u8 gCrashScreenRegisterR11[] = _("r11: ");
  50. const u8 gCrashScreenRegisterR12[] = _("r12: ");
  51. const u8 gCrashScreenRegisterLR[] = _("lr: ");
  52. const u8 gCrashScreenRegisterStatusFlags[] = _("cp: ");
  53. const u8 gCrashScreenRegisterSP[] = _("sp: ");
  54. const u8 gCrashScreenStackTrace[] = _("trace: ");
  55.  
  56. const u8 gCrashScreenPlaceholderText[] = _("{UNKNOWN_14 6}{STR_VAR_1}");
  57.  
  58. const u8 gCrashScreenExceptionTaskOverflow[] = _("TASK OVERFLOW");
  59.  
  60. EWRAM_DATA u32 CrashException = {0};
  61. EWRAM_DATA struct CrashScreen gCrashScreenInfo = {0};
  62.  
  63. void DoCrashScreen(void);
  64.  
  65. // copy the registers and current information to the struct.
  66. __attribute__((naked))
  67. void Crash(void)
  68. {
  69. asm(".syntax unified\n\
  70. push {lr}\n\
  71. mov lr, r12\n\
  72. push {lr}\n\
  73. mov lr, r11\n\
  74. push {lr}\n\
  75. mov lr, r10\n\
  76. push {lr}\n\
  77. mov lr, r9\n\
  78. push {lr}\n\
  79. mov lr, r8\n\
  80. push {r0-r7, lr}\n\
  81. pop {r0}\n\
  82. ldr r1, CrashPool\n\
  83. str r0, [r1]\n\
  84. ldr r0, CrashPool\n\
  85. pop {r1}\n\
  86. str r1, [r0, #0x4]\n\
  87. pop {r1}\n\
  88. str r1, [r0, #0x8]\n\
  89. pop {r1}\n\
  90. str r1, [r0, #0xC]\n\
  91. pop {r1}\n\
  92. str r1, [r0, #0x10]\n\
  93. pop {r1}\n\
  94. str r1, [r0, #0x14]\n\
  95. pop {r1}\n\
  96. str r1, [r0, #0x18]\n\
  97. pop {r1}\n\
  98. str r1, [r0, #0x1C]\n\
  99. pop {r1}\n\
  100. str r1, [r0, #0x20]\n\
  101. pop {r1}\n\
  102. str r1, [r0, #0x24]\n\
  103. pop {r1}\n\
  104. str r1, [r0, #0x28]\n\
  105. pop {r1}\n\
  106. str r1, [r0, #0x2C]\n\
  107. pop {r1}\n\
  108. str r1, [r0, #0x30]\n\
  109. pop {r1}\n\
  110. str r1, [r0, #0x34]\n\
  111. mov r1, sp\n\
  112. str r1, [r0, #0x38] @ the stack pointer is equal to its state from the previous function after the push/pops used to preserve the registers and lr.\n\
  113. ldr r1, [sp]\n\
  114. str r1, [r0, #0x40]\n\
  115. ldr r1, [sp, #0x4]\n\
  116. str r1, [r0, #0x44]\n\
  117. ldr r1, [sp, #0x8]\n\
  118. str r1, [r0, #0x48]\n\
  119. ldr r1, [sp, #0xC]\n\
  120. str r1, [r0, #0x4C]\n\
  121. ldr r1, [sp, #0x10]\n\
  122. str r1, [r0, #0x50]\n\
  123. ldr r1, [sp, #0x14]\n\
  124. str r1, [r0, #0x54]\n\
  125. ldr r1, [sp, #0x18]\n\
  126. str r1, [r0, #0x58]\n\
  127. .align 2\n\
  128. bx pc @ switch to ARM\n\
  129. nop @ it takes 1 cycle to switch.\n\
  130. .arm\n\
  131. mrs r1, cpsr\n\
  132. str r1, [r0, #0x3C]\n\
  133. bl DoCrashScreen\n\
  134. .align 2, 0\n\
  135. CrashPool: .4byte gCrashScreenInfo\n\
  136. .syntax divided");
  137. }
  138.  
  139. #define WIN_RANGE_(a, b) (((a) << 8) + (b))
  140.  
  141. void DoCrashScreen(void)
  142. {
  143. gCrashScreenInfo.exception = CrashException;
  144.  
  145. PlayBGM(BGM_STOP);
  146. {
  147. u8 *addr;
  148. u32 size;
  149.  
  150. addr = (u8 *)VRAM;
  151. size = 0x18000;
  152. while (1)
  153. {
  154. DmaFill16(3, 0, addr, 0x1000);
  155. addr += 0x1000;
  156. size -= 0x1000;
  157. if (size <= 0x1000)
  158. {
  159. DmaFill16(3, 0, addr, size);
  160. break;
  161. }
  162. }
  163. REG_WIN1H = WIN_RANGE(0, 240);
  164. REG_WIN1V = WIN_RANGE_(0, 240);
  165. DmaClear32(3, OAM, OAM_SIZE);
  166. DmaClear16(3, PLTT, PLTT_SIZE);
  167. ResetPaletteFade();
  168. SetUpWindowConfig(&gWindowConfig_81E71B4);
  169. MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4);
  170. while(!MultistepInitMenuWindowContinue()) // don't return!
  171. ;
  172. LoadPalette(gUnknown_0839F5FC, 0x80, 0x40);
  173. CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40);
  174. }
  175. MenuDrawTextWindow(0, 0, 29, 19);
  176. MenuPrint(gCrashScreenHeaderText, 1, 1);
  177. MenuPrint(gCrashScreenRegisterR0, 1, 5);
  178. MenuPrint(gCrashScreenRegisterR1, 1, 7);
  179. MenuPrint(gCrashScreenRegisterR2, 1, 9);
  180. MenuPrint(gCrashScreenRegisterR3, 1, 11);
  181. MenuPrint(gCrashScreenRegisterR4, 1, 13);
  182. MenuPrint(gCrashScreenRegisterR5, 1, 15);
  183. MenuPrint(gCrashScreenRegisterR6, 1, 17);
  184.  
  185. // print r0.
  186. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[0], STR_CONV_MODE_LEADING_ZEROS, 8);
  187. MenuPrint(gCrashScreenPlaceholderText, 4, 5);
  188. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[1], STR_CONV_MODE_LEADING_ZEROS, 8);
  189. MenuPrint(gCrashScreenPlaceholderText, 4, 7);
  190. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[2], STR_CONV_MODE_LEADING_ZEROS, 8);
  191. MenuPrint(gCrashScreenPlaceholderText, 4, 9);
  192. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[3], STR_CONV_MODE_LEADING_ZEROS, 8);
  193. MenuPrint(gCrashScreenPlaceholderText, 4, 11);
  194. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[4], STR_CONV_MODE_LEADING_ZEROS, 8);
  195. MenuPrint(gCrashScreenPlaceholderText, 4, 13);
  196. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[5], STR_CONV_MODE_LEADING_ZEROS, 8);
  197. MenuPrint(gCrashScreenPlaceholderText, 4, 15);
  198. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[6], STR_CONV_MODE_LEADING_ZEROS, 8);
  199. MenuPrint(gCrashScreenPlaceholderText, 4, 17);
  200.  
  201. MenuPrint(gCrashScreenRegisterR7, 11, 5);
  202. MenuPrint(gCrashScreenRegisterR8, 11, 7);
  203. MenuPrint(gCrashScreenRegisterR9, 11, 9);
  204. MenuPrint(gCrashScreenRegisterR10, 11, 11);
  205. MenuPrint(gCrashScreenRegisterR11, 11, 13);
  206. MenuPrint(gCrashScreenRegisterR12, 11, 15);
  207. MenuPrint(gCrashScreenRegisterLR, 11, 17);
  208.  
  209. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[7], STR_CONV_MODE_LEADING_ZEROS, 8);
  210. MenuPrint(gCrashScreenPlaceholderText, 14, 5);
  211. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[8], STR_CONV_MODE_LEADING_ZEROS, 8);
  212. MenuPrint(gCrashScreenPlaceholderText, 14, 7);
  213. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[9], STR_CONV_MODE_LEADING_ZEROS, 8);
  214. MenuPrint(gCrashScreenPlaceholderText, 14, 9);
  215. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[10], STR_CONV_MODE_LEADING_ZEROS, 8);
  216. MenuPrint(gCrashScreenPlaceholderText, 14, 11);
  217. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[11], STR_CONV_MODE_LEADING_ZEROS, 8);
  218. MenuPrint(gCrashScreenPlaceholderText, 14, 13);
  219. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.registers[12], STR_CONV_MODE_LEADING_ZEROS, 8);
  220. MenuPrint(gCrashScreenPlaceholderText, 14, 15);
  221. ConvertIntToHexStringN(gStringVar1, (u32)gCrashScreenInfo.returnPointer, STR_CONV_MODE_LEADING_ZEROS, 8);
  222. MenuPrint(gCrashScreenPlaceholderText, 14, 17);
  223.  
  224. MenuPrint(gCrashScreenRegisterStatusFlags, 1, 3);
  225.  
  226. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.statusRegister, STR_CONV_MODE_LEADING_ZEROS, 8);
  227. MenuPrint(gCrashScreenPlaceholderText, 4, 3);
  228.  
  229. MenuPrint(gCrashScreenRegisterSP, 11, 3);
  230.  
  231. ConvertIntToHexStringN(gStringVar1, (u32)gCrashScreenInfo.stackPointer, STR_CONV_MODE_LEADING_ZEROS, 8);
  232. MenuPrint(gCrashScreenPlaceholderText, 14, 3);
  233.  
  234. MenuPrint(gCrashScreenStackTrace, 21, 3);
  235.  
  236. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[0], STR_CONV_MODE_LEADING_ZEROS, 8);
  237. MenuPrint(gCrashScreenPlaceholderText, 21, 5);
  238. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[1], STR_CONV_MODE_LEADING_ZEROS, 8);
  239. MenuPrint(gCrashScreenPlaceholderText, 21, 7);
  240. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[2], STR_CONV_MODE_LEADING_ZEROS, 8);
  241. MenuPrint(gCrashScreenPlaceholderText, 21, 9);
  242. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[3], STR_CONV_MODE_LEADING_ZEROS, 8);
  243. MenuPrint(gCrashScreenPlaceholderText, 21, 11);
  244. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[4], STR_CONV_MODE_LEADING_ZEROS, 8);
  245. MenuPrint(gCrashScreenPlaceholderText, 21, 13);
  246. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[5], STR_CONV_MODE_LEADING_ZEROS, 8);
  247. MenuPrint(gCrashScreenPlaceholderText, 21, 15);
  248. ConvertIntToHexStringN(gStringVar1, gCrashScreenInfo.stackTrace[6], STR_CONV_MODE_LEADING_ZEROS, 8);
  249. MenuPrint(gCrashScreenPlaceholderText, 21, 17);
  250.  
  251. while(1)
  252. {
  253. WaitForVBlank();
  254. }
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement