Advertisement
glank

zu_reset.diff

Sep 28th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 30.13 KB | None | 0 0
  1. diff --git a/src/gz/zu.c b/src/gz/zu.c
  2. index 5bd6bed..b6d88d2 100644
  3. --- a/src/gz/zu.c
  4. +++ b/src/gz/zu.c
  5. @@ -319,23 +319,100 @@ void zu_sram_write(void *dram_addr, uint32_t sram_addr, size_t size)
  6.  
  7.  void zu_reset(void)
  8.  {
  9. -  volatile uint32_t *mi_intr = (void*)0xA4300008;
  10.    volatile uint32_t *sp_status = (void*)0xA4040010;
  11. -  /* disable interrupts */
  12. -  __asm__ volatile ("mfc0 $t0, $12  \n"
  13. -                    "and  $t0, %0   \n"
  14. -                    "mtc0 $t0, $12  \n" :: "r"(~MIPS_STATUS_IE));
  15. -  /* wait for rsp to halt */
  16. -  while (!(*sp_status & 3))
  17. -    ;
  18. -  /* wait for dma busy */
  19. -  while (pi_regs.status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY))
  20. -    ;
  21. -  /* reset pi */
  22. -  pi_regs.status = PI_STATUS_RESET | PI_STATUS_CLR_INTR;
  23. -  /* wait for vblank */
  24. -  while (!(*mi_intr & 8))
  25. -    ;
  26. +  volatile uint32_t *mi_mode = (void*)0xA4300000;
  27. +  volatile uint32_t *mi_intr_mask = (void*)0xA430000C;
  28. +  //volatile uint32_t *vi_status = (void*)0xA4400000;
  29. +  volatile uint32_t *pi_status = (void*)0xA4600010;
  30. +  volatile uint32_t *si_status = (void*)0xA4800018;
  31. +
  32. +  __asm__ volatile (/* reset cp0 status (disable interrupts) */
  33. +                    "la    $t0, 0b00110100000000000000000000000000;"
  34. +                    "mtc0  $t0, $12;"
  35. +                    /* reset cp1 fpcsr */
  36. +                    "la    $t0, 0b00000001100000000000100000000000;"
  37. +                    "ctc1  $t0, $31;");
  38. +
  39. +  /* reset everything */
  40. +  *sp_status = 0b0101010101010101010101110;
  41. +  //*vi_status = 0;
  42. +  *pi_status = 0b11;
  43. +  *si_status = 0;
  44. +  *mi_mode = 0b01101010000000;
  45. +  *mi_intr_mask = 0b010101010101;
  46. +
  47. +  /* flush data cache */
  48. +  for (uint32_t p = 0x80000000; p < 0x80800000; p += 0x10)
  49. +    __asm__ volatile ("cache 0x19, 0x0000(%0);" :: "r"(p));
  50. +
  51. +#ifdef WIIVC
  52. +  __asm__ volatile (".set  push;"
  53. +                    ".set  noat;"
  54. +                    ".set  noreorder;"
  55. +                    /* 80000004 */
  56. +                    /* dma rom to ram */
  57. +                    "lui   $t3, 0xB000;"
  58. +                    "lw    $t1, 0x0008($t3);"
  59. +                    "lui   $t2, 0x1FFF;"
  60. +                    "ori   $t2, $t2, 0xFFFF;"
  61. +                    "lui   $at, 0xA460;"
  62. +                    "and   $t1, $t1, $t2;"
  63. +                    "sw    $t1, 0x0000($at);"
  64. +                    "lui   $t0, 0xA460;"
  65. +                    "lw    $t0, 0x0010($t0);"
  66. +                    "andi  $t0, $t0, 0x0002;"
  67. +                    "bnel  $t0, $zero, . - 0x0008;"
  68. +                    "lui   $t0, 0xA460;"
  69. +                    "addiu $t0, $zero, 0x1000;"
  70. +                    "add   $t0, $t0, $t3;"
  71. +                    "and   $t0, $t0, $t2;"
  72. +                    "lui   $at, 0xA460;"
  73. +                    "sw    $t0, 0x0004($at);"
  74. +                    "lui   $t2, 0x0010;"
  75. +                    "addiu $t2, $t2, 0xFFFF;"
  76. +                    "lui   $at, 0xA460;"
  77. +                    "sw    $t2, 0x000C($at);"
  78. +                    /* wait for dma to complete */
  79. +                    ".rept 0x10;"
  80. +                    "nop;"
  81. +                    ".endr;"
  82. +                    "lui   $t3, 0xA460;"
  83. +                    "lw    $t3, 0x0010($t3);"
  84. +                    "andi  $t3, $t3, 0x0001;"
  85. +                    "bnez  $t3, . - 0x4C;"
  86. +                    "nop;"
  87. +
  88. +                    /* set mi intr mask (clear all) */
  89. +                    "lui   $at, 0xA430;"
  90. +                    "addiu $t0, $zero, 0x0555;"
  91. +                    "sw    $t0, 0x000C($at);"
  92. +                    /* clear si interrupt */
  93. +                    "lui   $at, 0xA480;"
  94. +                    "sw    $zero, 0x0018($at);"
  95. +                    /* clear ai  interrupt */
  96. +                    "lui   $at, 0xA450;"
  97. +                    "sw    $zero, 0x000C($at);"
  98. +                    /* clear dp interrupt */
  99. +                    "lui   $at, 0xA430;"
  100. +                    "addiu $t1, $zero, 0x0800;"
  101. +                    "sw    $t1, 0x0000($at);"
  102. +                    /* clear pi interrupt */
  103. +                    "addiu $t1, $zero, 0x0002;"
  104. +                    "lui   $at, 0xA460;"
  105. +                    "sw    $t1, 0x0010($at);"
  106. +
  107. +                    /* jump to game code */
  108. +                    "lui   $t3, 0xB000;"
  109. +#if 0
  110. +                    "lw    $t1, 0x0008($t3);"
  111. +#else
  112. +                    "lui   $t1, 0x8040;"
  113. +                    "addiu $t1, $t1, 0x0000;"
  114. +#endif
  115. +                    "jr    $t1;"
  116. +                    "nop;"
  117. +                    ".set  pop;");
  118. +#else
  119.    /* copy pif code to rsp imem */
  120.    uint32_t imem[] =
  121.    {
  122. @@ -352,22 +429,578 @@ void zu_reset(void)
  123.    /* copy cic boot code to rsp dmem */
  124.    memcpy((void*)0xA4000040, (void*)0xB0000040, 0x0FC0);
  125.    /* simulate boot from cic boot code */
  126. -  __asm__ volatile ("lui  $t0, 0x8000       \n"
  127. +  __asm__ volatile ("lui   $t0, 0x8000;"
  128.                      /* osRomType (0: N64, 1: 64DD) */
  129. -                    "li   $s3, 0x0000       \n"
  130. +                    "li    $s3, 0x0000;"
  131.                      /* osTvType (0: PAL, 1: NTSC, 2: MPAL) */
  132. -                    "lw   $s4, 0x0300($t0)  \n"
  133. +                    "lw    $s4, 0x0300($t0);"
  134.                      /* osResetType (0: Cold, 1: NMI) */
  135. -                    "li   $s5, 0x0001       \n"
  136. +                    "li    $s5, 0x0001;"
  137.                      /* osCicId (3F: 6101/6102, 78: 6103, 91: 6105, 85: 6106) */
  138. -                    "li   $s6, 0x0091       \n"
  139. +                    "li    $s6, 0x0091;"
  140.                      /* osVersion */
  141. -                    "lw   $s7, 0x0314($t0)  \n"
  142. +                    "lw    $s7, 0x0314($t0);"
  143.                      /* go */
  144. -                    "la   $t3, 0xA4000040   \n"
  145. -                    "la   $sp, 0xA4001FF0   \n"
  146. -                    "la   $ra, 0xA4001550   \n"
  147. -                    "jr   $t3               \n");
  148. +                    "la    $t3, 0xA4000040;"
  149. +                    "la    $sp, 0xA4001FF0;"
  150. +                    "la    $ra, 0xA4001550;"
  151. +#if 0
  152. +                    /* jump to boot code */
  153. +                    "jr    $t3;"
  154. +#elif 1
  155. +                    /* jump to k1 */
  156. +                    "la    $t0, . + 0x0024;"
  157. +                    "lui   $t1, 0x8000;"
  158. +                    "addiu $t1, $t1, 0xFFFF;"
  159. +                    "lui   $t2, 0xA000;"
  160. +                    "addiu $t2, $t2, 0x0000;"
  161. +                    "and   $t0, $t0, $t1;"
  162. +                    "or    $t0, $t0, $t2;"
  163. +                    "jr    $t0;"
  164. +                    "nop;"
  165. +#endif
  166. +
  167. +                    ".set  push;"
  168. +                    ".set  noat;"
  169. +                    ".set  noreorder;"
  170. +                    /* A4000040 */
  171. +                    /* decode rsp boot code */
  172. +                    "add   $t1, $sp, $zero;"
  173. +                    "lw    $t0, -0x0FF0($t1);"
  174. +                    "lw    $t2, 0x0044($t3);"
  175. +                    "xor   $t2, $t2, $t0;"
  176. +                    "sw    $t2, -0x0FF0($t1);"
  177. +                    "addi  $t3, $t3, 0x0004;"
  178. +                    "andi  $t0, $t0, 0x0FFF;"
  179. +                    "bnez  $t0, . - 0x0018;"
  180. +                    "addi  $t1, $t1, 0x0004;"
  181. +                    "lw    $t0, 0x0044($t3);"
  182. +                    "lw    $t2, 0x0048($t3);"
  183. +                    "sw    $t0, -0x0FF0($t1);"
  184. +                    "sw    $t2, -0x0FEC($t1);"
  185. +                    /* this branch is always taken */
  186. +                    //"bltz  $ra, ..."
  187. +                    "sw    $zero, -0x0FE8($t1);"
  188. +                    "mtc0  $zero, $13;"
  189. +                    "mtc0  $zero, $9;"
  190. +                    "mtc0  $zero, $11;"
  191. +
  192. +#if 1
  193. +                    /* A40000C4 */
  194. +                    /* rdram configuration */
  195. +                    "lui   $t0, 0xA470;"
  196. +                    "addiu $t0, $t0, 0x0000;"
  197. +                    "lw    $t1, 0x000C($t0);" /* RI_SELECT_REG */
  198. +                    "bnez  $t1, . + 0x03B8;"
  199. +                    "nop;"
  200. +                    "addiu $sp, $sp, 0xFFE8;"
  201. +                    "sw    $s3, 0x0000($sp);"
  202. +                    "sw    $s4, 0x0004($sp);"
  203. +                    "sw    $s5, 0x0008($sp);"
  204. +                    "sw    $s6, 0x000C($sp);"
  205. +                    "sw    $s7, 0x0010($sp);"
  206. +                    "lui   $t0, 0xA470;"
  207. +                    "addiu $t0, 0x0000;"
  208. +                    "lui   $t2, 0xA3F8;"
  209. +                    "lui   $t3, 0xA3F0;"
  210. +                    "lui   $t4, 0xA430;"
  211. +                    "addiu $t4, $t4, 0x0000;"
  212. +                    "ori   $t1, $zero, 0x0040;"
  213. +                    "sw    $t1, 0x0004($t0);" /* RI_CONFIG_REG */
  214. +                    "addiu $s1, $zero, 0x1F40;"
  215. +                    /* spin */
  216. +                    "nop;"
  217. +                    "addi  $s1, $s1, 0xFFFF;"
  218. +                    "bnez  $s1, . - 0x0008;"
  219. +                    "nop;"
  220. +                    "sw    $zero, 0x0008($t0);" /* RI_CURRENT_LOAD_REG */
  221. +                    "ori   $t1, $zero, 0x0014;"
  222. +                    "sw    $t1, 0x000C($t0);" /* RI_SELECT_REG */
  223. +                    "sw    $zero, 0x0000($t0);" /* RI_MODE_REG */
  224. +                    "addiu $s1, $zero, 0x0004;"
  225. +                    /* spin */
  226. +                    "nop;"
  227. +                    "addi  $s1, $s1, 0xFFFF;"
  228. +                    "bnez  $s1, . - 0x0008;"
  229. +                    "nop;"
  230. +
  231. +                    "ori   $t1, $zero, 0x000E;"
  232. +                    "sw    $t1, 0x0000($t0);" /* RI_MODE_REG */
  233. +                    "addiu $s1, $zero, 0x0020;"
  234. +                    "addi  $s1, $s1, 0xFFFF;"
  235. +                    "bnez  $s1, . - 0x0004;"
  236. +                    "ori   $t1, $zero, 0x010F;"
  237. +                    "sw    $t1, 0x0000($t4);" /* MI_MODE_REG (set init mode 15) */
  238. +                    "lui   $t1, 0x1808;"
  239. +                    "ori   $t1, $t1, 0x2838;"
  240. +                    "sw    $t1, 0x0008($t2);" /* RDRAM_GLOBAL_CONFIG, RDRAM_DELAY_REG */
  241. +                    "sw    $zero, 0x0014($t2);" /* RDRAM_GLOBAL_CONFIG, RDRAM_REF_ROW_REG */
  242. +                    "lui   $t1, 0x8000;"
  243. +                    "sw    $t1, 0x0004($t2);" /* RDRAM_GLOBAL_CONFIG, RDRAM_DEVICE_ID_REG */
  244. +                    "or    $t5, $zero, $zero;"
  245. +                    "or    $t6, $zero, $zero;"
  246. +                    "lui   $t7, 0xA3F0;"
  247. +                    "or    $t8, $zero, $zero;"
  248. +                    "lui   $t9, 0xA3F0;"
  249. +                    "lui   $s6, 0xA000;"
  250. +                    "or    $s7, $zero, $zero;"
  251. +                    "lui   $a2, 0xA3F0;"
  252. +                    "lui   $a3, 0xA000;"
  253. +                    "or    $s2, $zero, $zero;"
  254. +                    "lui   $s4, 0xA000;"
  255. +                    "addiu $sp, $sp, 0xFFB8;"
  256. +                    "or    $s8, $sp, $zero;"
  257. +                    "lui   $s0, 0xA430;"
  258. +                    "lw    $s0, 0x0004($s0);" /* MI_VERSION_REG */
  259. +                    "lui   $s1, 0x0101;"
  260. +                    "addiu $s1, $s1, 0x0101;"
  261. +                    "bne   $s0, $s1, . + 0x0018;"
  262. +                    "nop;"
  263. +                    "addiu $s0, $zero, 0x0200;"
  264. +                    "ori   $s1, $t3, 0x4000;"
  265. +                    "beq   $zero, $zero, . + 0x0010;"
  266. +                    "nop;"
  267. +                    "addiu $s0, $zero, 0x0400;"
  268. +                    "ori   $s1, $t3, 0x8000;"
  269. +                    "sw    $t6, 0x0004($s1);" /* RDRAM_DEVICE_ID_REG */
  270. +                    "addiu $s5, $t7, 0x000C;" /* RDRAM_MODE_REG */
  271. +                    "jal   0xA400087C;"
  272. +                    "nop;"
  273. +                    "beq   $v0, $zero, . + 0x00E4;"
  274. +                    "nop;"
  275. +                    "sw    $v0, 0x0000($sp);"
  276. +                    "addiu $t1, $zero, 0x2000;"
  277. +                    "sw    $t1, 0x0000($t4);" /* MI_MODE_REG (MI_SET_RDRAM) */
  278. +                    "lw    $t3, 0x0000($t7);" /* RDRAM_DEVICE_TYPE_REG */
  279. +                    "lui   $t0, 0xF0FF;"
  280. +                    "and   $t3, $t3, $t0;"
  281. +                    "sw    $t3, 0x0004($sp);"
  282. +                    "addi  $sp, $sp, 0x0008;"
  283. +                    "addiu $t1, $zero, 0x1000;"
  284. +                    "sw    $t1, 0x0000($t4);" /* MI_MODE_REG (MI_CLR_RDRAM) */
  285. +                    "lui   $t0, 0xB019;"
  286. +                    "bne   $t3, $t0, . + 0x0034;"
  287. +                    "nop;"
  288. +                    "lui   $t0, 0x0800;"
  289. +                    "add   $t8, $t8, $t0;"
  290. +                    "add   $t9, $t9, $s0;"
  291. +                    "add   $t9, $t9, $s0;"
  292. +                    "lui   $t0, 0x0020;"
  293. +                    "add   $s6, $s6, $t0;"
  294. +                    "add   $s4, $s4, $t0;"
  295. +                    "sll   $s2, $s2, 0x01;"
  296. +                    "addi  $s2, $s2, 0x0001;"
  297. +                    "beq   $zero, $zero, . + 0x0010;"
  298. +                    "nop;"
  299. +                    "lui   $t0, 0x0010;"
  300. +                    "add   $s4, $s4, $t0;"
  301. +                    "addiu $t0, $zero, 0x2000;"
  302. +                    "sw    $t0, 0x0000($t4);" /* MI_MODE_REG (MI_SET_RDRAM) */
  303. +                    "lw    $t1, 0x0024($t7);" /* RDRAM_DEVICE_MANUF_REG */
  304. +                    "lw    $k0, 0x0000($t7);" /* RDRAM_DEVICE_TYPE_REG */
  305. +                    "addiu $t0, $zero, 0x1000;"
  306. +                    "sw    $t0, 0x0000($t4);" /* MI_MODE_REG (MI_CLR_RDRAM) */
  307. +                    "andi  $t1, $t1, 0xFFFF;"
  308. +                    "addiu $t0, $zero, 0x0500;"
  309. +                    "bne   $t1, $t0, . + 0x0028;"
  310. +                    "nop;"
  311. +                    "lui   $k1, 0x0100;"
  312. +                    "and   $k0, $k0, $k1;"
  313. +                    "bnez  $k0, . + 0x0018;"
  314. +                    "nop;"
  315. +                    "lui   $t0, 0x101C;"
  316. +                    "ori   $t0, $t0, 0x0A04;"
  317. +                    "sw    $t0, 0x0018($t7);" /* RDRAM_RAS_INTERVAL_REG */
  318. +                    "beq   $zero, $zero, . + 0x0010;"
  319. +                    "lui   $t0, 0x080C;"
  320. +                    "ori   $t0, $t0, 0x1204;"
  321. +                    "sw    $t0, 0x0018($t7);" /* RDRAM_RAS_INTERVAL_REG */
  322. +                    "lui   $t0, 0x0800;"
  323. +                    "add   $t6, $t6, $t0;"
  324. +                    "add   $t7, $t7, $s0;"
  325. +                    "add   $t7, $t7, $s0;"
  326. +                    "addiu $t5, $t5, 0x0001;"
  327. +                    "sltiu $t0, $t5, 0x0008;"
  328. +                    "bnez  $t0, . - 0x00EC;"
  329. +                    "nop;"
  330. +                    "lui   $t0, 0xC400;"
  331. +                    "sw    $t0, 0x000C($t2);" /* RDRAM_GLOBAL_CONFIG, RDRAM_MODE_REG */
  332. +                    "lui   $t0, 0x8000;"
  333. +                    "sw    $t0, 0x0004($t2);" /* RDRAM_GLOBAL_CONFIG, RDRAM_DEVICE_ID_REG */
  334. +                    "or    $sp, $s8, $zero;"
  335. +                    "or    $v1, $zero, $zero;"
  336. +                    "lw    $t1, 0x0004($sp);"
  337. +                    "lui   $t0, 0xB009;"
  338. +                    "bne   $t1, $t0, . + 0x005C;"
  339. +                    "nop;"
  340. +                    "sw    $t8, 0x0004($s1);" /* RDRAM_DEVICE_ID_REG */
  341. +                    "addiu $s5, $t9, 0x000C;"
  342. +                    "lw    $a0, 0x0000($sp);"
  343. +                    "addi  $sp, $sp, 0x0008;"
  344. +                    "addiu $a1, $zero, 0x0001;"
  345. +                    "jal   0xA4000B44;"
  346. +                    "nop;"
  347. +                    "lw    $t0, 0x0000($s6);"
  348. +                    "lui   $t0, 0x0008;"
  349. +                    "add   $t0, $t0, $s6;"
  350. +                    "lw    $t1, 0x0000($t0);"
  351. +                    "lw    $t0, 0x0000($s6);"
  352. +                    "lui   $t0, 0x0008;"
  353. +                    "add   $t0, $t0, $s6;"
  354. +                    "lw    $t1, 0x0000($t0);"
  355. +                    "lui   $t0, 0x0400;"
  356. +                    "add   $t6, $t6, $t0;"
  357. +                    "add   $t9, $t9, $s0;"
  358. +                    "lui   $t0, 0x0010;"
  359. +                    "add   $s6, $s6, $t0;"
  360. +                    "beq   $zero, $zero, . + 0x0088;"
  361. +                    "sw    $s7, 0x0004($s1);" /* RDRAM_DEVICE_ID_REG */
  362. +                    "addiu $s5, $a2, 0x000C;"
  363. +                    "lw    $a0, 0x0000($sp);"
  364. +                    "addi  $sp, $sp, 0x0008;"
  365. +                    "addiu $a1, $zero, 0x0001;"
  366. +                    "jal   0xA4000B44;"
  367. +                    "nop;"
  368. +                    "lw    $t0, 0x0000($a3);"
  369. +                    "lui   $t0, 0x0008;"
  370. +                    "add   $t0, $t0, $a3;"
  371. +                    "lw    $t1, 0x0000($t0);"
  372. +                    "lui   $t0, 0x0010;"
  373. +                    "add   $t0, $t0, $a3;"
  374. +                    "lw    $t1, 0x0000($t0);"
  375. +                    "lui   $t0, 0x0018;"
  376. +                    "add   $t0, $t0, $a3;"
  377. +                    "lw    $t1, 0x0000($t0);"
  378. +                    "lw    $t0, 0x0000($a3);"
  379. +                    "lui   $t0, 0x0008;"
  380. +                    "add   $t0, $t0, $a3;"
  381. +                    "lw    $t1, 0x0000($t0);"
  382. +                    "lui   $t0, 0x0010;"
  383. +                    "add   $t0, $t0, $a3;"
  384. +                    "lw    $t1, 0x0000($t0);"
  385. +                    "lui   $t0, 0x0018;"
  386. +                    "add   $t0, $t0, $a3;"
  387. +                    "lw    $t1, 0x0000($t0);"
  388. +                    "lui   $t0, 0x0800;"
  389. +                    "add   $s7, $s7, $t0;"
  390. +                    "add   $a2, $a2, $s0;"
  391. +                    "add   $a2, $a2, $s0;"
  392. +                    "lui   $t0, 0x0020;"
  393. +                    "add   $a3, $a3, $t0;"
  394. +                    "addiu $v1, $v1, 0x0001;"
  395. +                    "slt   $t0, $v1, $t5;"
  396. +                    "bnez  $t0, . - 0x00F0;"
  397. +                    "nop;"
  398. +                    "lui   $t2, 0xA470;"
  399. +                    "sll   $s2, $s2, 0x13;"
  400. +                    "lui   $t1, 0x0006;"
  401. +                    "ori   $t1, $t1, 0x3634;"
  402. +                    "or    $t1, $t1, $s2;"
  403. +                    "sw    $t1, 0x0010($t2);" /* RI_REFRESH_REG */
  404. +                    "lw    $t1, 0x0010($t2);" /* RI_REFRESH_REG */
  405. +                    "lui   $t0, 0xA000;"
  406. +                    "ori   $t0, $t0, 0x03F0;"
  407. +                    "lui   $t1, 0x0FFF;"
  408. +                    "ori   $t1, $t1, 0xFFFF;"
  409. +                    "and   $s6, $s6, $t1;"
  410. +                    "sw    $s6, 0x0000($t0);"
  411. +                    "or    $sp, $s8, $zero;"
  412. +                    "addiu $sp, $sp, 0x0048;"
  413. +                    "lw    $s3, 0x0000($sp);"
  414. +                    "lw    $s4, 0x0004($sp);"
  415. +                    "lw    $s5, 0x0008($sp);"
  416. +                    "lw    $s6, 0x000C($sp);"
  417. +                    "lw    $s7, 0x0010($sp);"
  418. +                    "addiu $sp, $sp, 0x0018;"
  419. +#endif
  420. +
  421. +#if 1
  422. +                    /* A4000438 */
  423. +                    /* invalidate cache */
  424. +                    "lui   $t0, 0x8000;"
  425. +                    "addiu $t0, $t0, 0x0000;"
  426. +                    "addiu $t1, $t0, 0x4000;"
  427. +                    "addiu $t1, $t1, 0xFFE0;"
  428. +                    "mtc0  $zero, $28;"
  429. +                    "mtc0  $zero, $29;"
  430. +                    "cache 0x08, 0x0000($t0);"
  431. +                    "sltu  $at, $t0, $t1;"
  432. +                    "bnez  $at, . - 0x0008;"
  433. +                    "addiu $t0, $t0, 0x0020;"
  434. +                    "lui   $t0, 0x8000;"
  435. +                    "addiu $t0, 0x0000;"
  436. +                    "addiu $t1, $t0, 0x2000;"
  437. +                    "addiu $t1, $t1, 0xFFF0;"
  438. +                    "cache 0x09, 0x0000($t0);"
  439. +                    "sltu  $at, $t0, $t1;"
  440. +                    "bnez  $at, . - 0x0008;"
  441. +                    "addiu $t0, $t0, 0x0010;"
  442. +                    "beq   $zero, $zero, . + 0x0050;"
  443. +                    "nop;"
  444. +                    /* A4000488 */
  445. +                    "lui   $t0, 0x8000;"
  446. +                    "addiu $t0, $t0, 0x0000;"
  447. +                    "addiu $t1, $t0, 0x4000;"
  448. +                    "addiu $t1, $t1, 0xFFE0;"
  449. +                    "mtc0  $zero, $28;"
  450. +                    "mtc0  $zero, $29;"
  451. +                    "cache 0x08, 0x0000($t0);"
  452. +                    "sltu  $at, $t0, $t1;"
  453. +                    "bnez  $at, . - 0x0008;"
  454. +                    "addiu $t0, $t0, 0x0020;"
  455. +                    "lui   $t0, 0x8000;"
  456. +                    "addiu $t0, 0x0000;"
  457. +                    "addiu $t1, $t0, 0x2000;"
  458. +                    "addiu $t1, $t1, 0xFFF0;"
  459. +                    "cache 0x01, 0x0000($t0);"
  460. +                    "sltu  $at, $t0, $t1;"
  461. +                    "bnez  $at, . - 0x0008;"
  462. +                    "addiu $t0, $t0, 0x0010;"
  463. +#endif
  464. +
  465. +#if 1
  466. +                    /* A40004D0 */
  467. +                    /* start rsp */
  468. +                    "addiu $t2, $zero, 0x00CE;"
  469. +                    "lui   $at, 0xA404;"
  470. +                    "sw    $t2, 0x0010($at);"
  471. +                    "lui   $t2, 0xB000;"
  472. +                    "addiu $t2, $t2, 0x0000;"
  473. +                    "lui   $t3, 0xFFF0;"
  474. +                    "lui   $t1, 0x0010;"
  475. +                    "and   $t2, $t2, $t3;"
  476. +                    "lui   $t0, 0xB000;"
  477. +                    "addiu $t1, $t1, 0xFFFF;"
  478. +                    "lui   $t3, 0xB000;"
  479. +                    "addiu $t0, $t0, 0x0554;"
  480. +                    "addiu $t3, $t3, 0x0888;"
  481. +                    "and   $t0, $t0, $t1;"
  482. +                    "and   $t3, $t3, $t1;"
  483. +                    "lui   $at, 0xA408;"
  484. +                    "lui   $t1, 0xA000;"
  485. +                    "sw    $zero, 0x0000($at);"
  486. +                    "or    $t0, $t0, $t2;"
  487. +                    "or    $t3, $t3, $t2;"
  488. +                    "addiu $t1, $t1, 0x0004;"
  489. +                    "lw    $t5, 0x0000($t0);"
  490. +                    "addiu $t0, $t0, 0x0004;"
  491. +                    "sltu  $at, $t0, $t3;"
  492. +                    "addiu $t1, $t1, 0x0004;"
  493. +                    "bnez  $at, . - 0x0010;"
  494. +                    "sw    $t5, -0x0004($t1);"
  495. +#endif
  496. +
  497. +#if 0
  498. +                    /* jump to final stage of ipl */
  499. +                    "lui   $t4, 0x8000;"
  500. +                    "addiu $t2, $zero, 0x00AD;"
  501. +                    "lui   $at, 0xA404;"
  502. +                    "addiu $t4, $t4, 0x0004;"
  503. +                    "jr    $t4;"
  504. +                    "sw    $t2, 0x0010($at);"
  505. +#elif 1
  506. +                    /* jump to k0 */
  507. +                    "addiu $t2, $zero, 0x00AD;"
  508. +                    "lui   $at, 0xA404;"
  509. +                    "sw    $t2, 0x0010($at);"
  510. +                    "la    $t0, . + 0x0024;"
  511. +                    "lui   $t1, 0x8000;"
  512. +                    "addiu $t1, $t1, 0xFFFF;"
  513. +                    "lui   $t2, 0x8000;"
  514. +                    "addiu $t2, $t2, 0x0000;"
  515. +                    "and   $t0, $t0, $t1;"
  516. +                    "or    $t0, $t0, $t2;"
  517. +                    "jr    $t0;"
  518. +                    "nop;"
  519. +#endif
  520. +
  521. +                    /* 80000004 */
  522. +                    /* dma rom to ram */
  523. +                    "lui   $t3, 0xB000;"
  524. +                    "lw    $t1, 0x0008($t3);"
  525. +                    "lui   $t2, 0x1FFF;"
  526. +                    "ori   $t2, $t2, 0xFFFF;"
  527. +                    "lui   $at, 0xA460;"
  528. +                    "and   $t1, $t1, $t2;"
  529. +                    "sw    $t1, 0x0000($at);"
  530. +                    "lui   $t0, 0xA460;"
  531. +                    "lw    $t0, 0x0010($t0);"
  532. +                    "andi  $t0, $t0, 0x0002;"
  533. +                    "bnel  $t0, $zero, . - 0x0008;"
  534. +                    "lui   $t0, 0xA460;"
  535. +                    "addiu $t0, $zero, 0x1000;"
  536. +                    "add   $t0, $t0, $t3;"
  537. +                    "and   $t0, $t0, $t2;"
  538. +                    "lui   $at, 0xA460;"
  539. +                    "sw    $t0, 0x0004($at);"
  540. +                    "lui   $t2, 0x0010;"
  541. +                    "addiu $t2, $t2, 0xFFFF;"
  542. +                    "lui   $at, 0xA460;"
  543. +                    "sw    $t2, 0x000C($at);"
  544. +                    /* wait for dma to complete */
  545. +                    ".rept 0x10;"
  546. +                    "nop;"
  547. +                    ".endr;"
  548. +                    "lui   $t3, 0xA460;"
  549. +                    "lw    $t3, 0x0010($t3);"
  550. +                    "andi  $t3, $t3, 0x0001;"
  551. +                    "bnez  $t3, . - 0x4C;"
  552. +                    "nop;"
  553. +
  554. +                    /* clear sp semaphore */
  555. +                    "lui   $at, 0xA404;"
  556. +                    "sw    $zero, 0x001C($at);"
  557. +
  558. +#if 1
  559. +                    /* 800000B4 */
  560. +                    /* compute checksum */
  561. +                    "lui   $t3, 0xB000;"
  562. +                    "lw    $a0, 0x0008($t3);"
  563. +                    "or    $a1, $s6, $zero;"
  564. +                    "lui   $at, 0x5D58;"
  565. +                    "ori   $at, 0x8B65;"
  566. +                    "multu $a1, $at;"
  567. +                    "addiu $sp, $sp, 0xFFE0;"
  568. +                    "sw    $ra, 0x001C($sp);"
  569. +                    "sw    $s0, 0x0014($sp);"
  570. +                    "lui   $s6, 0xA000;"
  571. +                    "addiu $s6, $s6, 0x0200;"
  572. +                    "lui   $ra, 0x0010;"
  573. +                    "or    $v1, $zero, $zero;"
  574. +                    "or    $t0, $zero, $zero;"
  575. +                    "or    $t1, $a0, $zero;"
  576. +                    "mflo  $v0;"
  577. +                    "addiu $v0, $v0, 0x0001;"
  578. +                    "or    $a3, $v0, $zero;"
  579. +                    "or    $t2, $v0, $zero;"
  580. +                    "or    $t3, $v0, $zero;"
  581. +                    "or    $s0, $v0, $zero;"
  582. +                    "or    $a2, $v0, $zero;"
  583. +                    "or    $t4, $v0, $zero;"
  584. +                    "addiu $t5, $zero, 0x0020;"
  585. +                    "lw    $v0, 0x0000($t1);"
  586. +                    "addu  $v1, $a3, $v0;"
  587. +                    "sltu  $at, $v1, $a3;"
  588. +                    "beq   $at, $zero, . + 0x000C;"
  589. +                    "or    $a1, $v1, $zero;"
  590. +                    "addiu $t2, $t2, 0x0001;"
  591. +                    "andi  $v1, $v0, 0x001F;"
  592. +                    "subu  $t7, $t5, $v1;"
  593. +                    "srlv  $t8, $v0, $t7;"
  594. +                    "sllv  $t6, $v0, $v1;"
  595. +                    "or    $a0, $t6, $t8;"
  596. +                    "sltu  $at, $a2, $v0;"
  597. +                    "or    $a3, $a1, $zero;"
  598. +                    "xor   $t3, $t3, $v0;"
  599. +                    "beq   $at, $zero, . + 0x0014;"
  600. +                    "addu  $s0, $s0, $a0;"
  601. +                    "xor   $t9, $a3, $v0;"
  602. +                    "beq   $zero, $zero, . + 0x000C;"
  603. +                    "xor   $a2, $t9, $a2;"
  604. +                    "xor   $a2, $a2, $a0;"
  605. +                    "lw    $t7, 0x0000($s6);"
  606. +                    "addiu $t0, $t0, 0x0004;"
  607. +                    "addiu $s6, $s6, 0x0004;"
  608. +                    "xor   $t7, $v0, $t7;"
  609. +                    "addu  $t4, $t7, $t4;"
  610. +                    "lui   $t7, 0xA000;"
  611. +                    "ori   $t7, $t7, 0x02FF;"
  612. +                    "addiu $t1, $t1, 0x0004;"
  613. +                    "bne   $t0, $ra, . - 0x0070;"
  614. +                    "and   $s6, $s6, $t7;"
  615. +                    "xor   $t6, $a3, $t2;"
  616. +                    "xor   $a3, $t6, $t3;"
  617. +#else
  618. +                    /* spin instead */
  619. +                    "lui   $t0, 0x0001;"
  620. +                    "bne   $t0, $zero, .;"
  621. +                    "addiu $t0, $t0, 0xFFFF;"
  622. +#endif
  623. +
  624. +                    /* 80000194 */
  625. +                    /* halt rsp */
  626. +                    "lui   $t3, 0x00AA;"
  627. +                    "ori   $t3, 0xAAAE;"
  628. +                    "lui   $at, 0xA404;"
  629. +                    "sw    $t3, 0x0010($at);"
  630. +
  631. +                    /* set mi intr mask (clear all) */
  632. +                    "lui   $at, 0xA430;"
  633. +                    "addiu $t0, $zero, 0x0555;"
  634. +                    "sw    $t0, 0x000C($at);"
  635. +                    /* clear si interrupt */
  636. +                    "lui   $at, 0xA480;"
  637. +                    "sw    $zero, 0x0018($at);"
  638. +                    /* clear ai  interrupt */
  639. +                    "lui   $at, 0xA450;"
  640. +                    "sw    $zero, 0x000C($at);"
  641. +                    /* clear dp interrupt */
  642. +                    "lui   $at, 0xA430;"
  643. +                    "addiu $t1, $zero, 0x0800;"
  644. +                    "sw    $t1, 0x0000($at);"
  645. +                    /* clear pi interrupt */
  646. +                    "addiu $t1, $zero, 0x0002;"
  647. +                    "lui   $at, 0xA460;"
  648. +                    "sw    $t1, 0x0010($at);"
  649. +
  650. +                    /* save startup info */
  651. +                    "lui   $t0, 0xA000;"
  652. +                    "ori   $t0, $t0, 0x0300;"
  653. +                    "xor   $t8, $s0, $a2;" /* checksum code */
  654. +                    "addiu $t1, $zero, 0x17D9;"
  655. +                    "xor   $s0, $t8, $t4;" /* checksum code */
  656. +                    "sw    $t1, 0x0010($t0);"
  657. +                    "sw    $s4, 0x0000($t0);"
  658. +                    "sw    $s3, 0x0004($t0);"
  659. +                    "sw    $s5, 0x000C($t0);"
  660. +                    "beq   $s3, $zero, . + 0x0014;" /* check reset type */
  661. +                    "sw    $s7, 0x0014($t0);"
  662. +                    "lui   $t1, 0xA600;"
  663. +                    "beq   $zero, $zero, . + 0x0010;"
  664. +                    "addiu $t1, 0x0000;"
  665. +                    "lui   $t1, 0xB000;"
  666. +                    "addiu $t1, $t1, 0x0000;"
  667. +                    "sw    $t1, 0x0008($t0);"
  668. +                    "lw    $t1, 0x00F0($t0);"
  669. +                    "lui   $t3, 0xB000;"
  670. +                    "sw    $t1, 0x0018($t0);"
  671. +
  672. +#if 1
  673. +                    /* check checksum */
  674. +                    "lw    $t0, 0x0010($t3);"
  675. +                    "bne   $a3, $t0, . + 0x001C;"
  676. +                    "nop;"
  677. +                    "lw    $t0, 0x0014($t3);"
  678. +                    "bne   $s0, $t0, . + 0x0010;"
  679. +                    "nop;"
  680. +                    "bgezal  $zero, . + 0x0010;"
  681. +                    "nop;"
  682. +                    "bgezal  $zero, .;"
  683. +                    "nop;"
  684. +#endif
  685. +
  686. +                    /* clear sp mem */
  687. +                    "lui   $t0, 0xA400;"
  688. +                    "addiu $t0, $t0, 0x0000;"
  689. +                    "lw    $s0, 0x0014($sp);" /* checksum code */
  690. +                    "lw    $ra, 0x001C($sp);" /* checksum code */
  691. +                    "addiu $sp, $sp, 0x0020;" /* checksum code */
  692. +                    "addi  $t1, $t0, 0x2000;"
  693. +                    "addiu $t0, $t0, 0x0004;"
  694. +                    "bne   $t0, $t1, . - 0x0004;"
  695. +                    "sw    $t1, -0x0004($t0);"
  696. +                    /* jump to game code */
  697. +                    "lui   $t3, 0xB000;"
  698. +#if 0
  699. +                    "lw    $t1, 0x0008($t3);"
  700. +#else
  701. +                    "lui   $t1, 0x8040;"
  702. +                    "addiu $t1, $t1, 0x0000;"
  703. +#endif
  704. +                    "jr    $t1;"
  705. +                    "nop;"
  706. +                    ".set  pop;");
  707. +#endif
  708.  }
  709.  
  710.  void zu_void(void)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement