Advertisement
EliteAnax17

Untitled

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