Advertisement
EliteAnax17

dma3_manager

Feb 16th, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.01 KB | None | 0 0
  1. void ProcessDma3Requests(void) {
  2. // NOTE: the fillerA member of the DMA struct is actually u32 value;
  3. // NOTE: gUnknown_0300001C is just a pointer inside the gDma3Requests structure, not a true symbol; feel free to remove
  4. u16 total_size;
  5. if (gDma3ManagerLocked) return;
  6. total_size = 0;
  7. while (gDma3Requests[gDma3RequestCursor].size) {
  8. total_size += gDma3Requests[gDma3RequestCursor].size;
  9. if (total_size > 0xA000) return; // don't do too much at once
  10. if (REG_VCOUNT > 224) return; // we're about to leave vblank, stop
  11. switch (gDma3Requests[gDma3RequestCursor].mode) {
  12.  
  13. case 1: { // regular 32-bit copy
  14. u32 request_size = gDma3Requests[gDma3RequestCursor].size;
  15. u32 * source = gDma3Requests[gDma3RequestCursor].src;
  16. u32 * destination = gDma3Requests[gDma3RequestCursor].dest;
  17. while (request_size > 0x1000) {
  18. DmaCopy32(3, source, destination, 0x1000);
  19. source += 0x1000 >> 2;
  20. destination += 0x1000 >> 2;
  21. request_size -= 0x1000;
  22. }
  23. DmaCopy32(3, source, destination, request_size);
  24. } break;
  25.  
  26. case 2: { // repeat a single 32-bit value across RAM
  27. u32 request_size = gDma3Requests[gDma3RequestCursor].size;
  28. u32 * destination = gDma3Requests[gDma3RequestCursor].dest;
  29. while (request_size > 0x1000) {
  30. DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, destination, 0x1000);
  31. destination += 0x1000 >> 2;
  32. request_size -= 0x1000;
  33. }
  34. DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, destination, request_size);
  35. } break;
  36.  
  37. case 3: { // regular 16-bit copy
  38. u32 request_size = gDma3Requests[gDma3RequestCursor].size;
  39. u16 * source = gDma3Requests[gDma3RequestCursor].src;
  40. u16 * destination = gDma3Requests[gDma3RequestCursor].dest;
  41. while (request_size > 0x1000) {
  42. DmaCopy16(3, source, destination, 0x1000);
  43. source += 0x1000 >> 1;
  44. destination += 0x1000 >> 1;
  45. request_size -= 0x1000;
  46. }
  47. DmaCopy16(3, source, destination, request_size);
  48. } break;
  49. case 4: { // repeat a single 16-bit value across RAM
  50. u32 request_size = gDma3Requests[gDma3RequestCursor].size;
  51. u16 * destination = gDma3Requests[gDma3RequestCursor].dest;
  52. while (request_size > 0x1000) {
  53. DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, destination, 0x1000);
  54. destination += 0x1000 >> 1;
  55. request_size -= 0x1000;
  56. }
  57. DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, destination, request_size);
  58. }
  59. }
  60. gDma3Requests[gDma3RequestCursor].src = NULL;
  61. gDma3Requests[gDma3RequestCursor].dest = NULL;
  62. gDma3Requests[gDma3RequestCursor].size = 0;
  63. gDma3Requests[gDma3RequestCursor].mode = 0;
  64. gDma3Requests[gDma3RequestCursor].value = 0;
  65. gDma3RequestCursor ++;
  66. if (gDma3RequestCursor >= 0x80) gDma3RequestCursor = 0;
  67. }
  68. }
  69.  
  70. /*
  71. thumb_func_start ProcessDma3Requests
  72. @ void ProcessDma3Requests()
  73. ProcessDma3Requests: @ 8000BF0
  74. push {r4-r7,lr}
  75. mov r7, r10
  76. mov r6, r9
  77. mov r5, r8
  78. push {r5-r7}
  79. sub sp, 0xC
  80. ldr r0, =gDma3ManagerLocked
  81. ldrb r0, [r0]
  82. cmp r0, 0
  83. beq _08000C06
  84. b _08000E46
  85. _08000C06:
  86. movs r0, 0
  87. str r0, [sp, 0x8]
  88. ldr r1, =gDma3Requests
  89. ldr r2, =gDma3RequestCursor
  90. ldrb r0, [r2]
  91. lsls r0, 4
  92. adds r0, r1
  93. ldrh r0, [r0, 0x8]
  94. mov r12, r2
  95. cmp r0, 0
  96. bne _08000C1E
  97. b _08000E46
  98. _08000C1E:
  99. mov r8, r1
  100. adds r1, 0x4
  101. mov r10, r1
  102. movs r6, 0x80
  103. lsls r6, 5
  104. ldr r7, =REG_DMA3
  105. movs r2, 0
  106. mov r9, r2
  107. _08000C2E:
  108. mov r3, r12 @ gDma3RequestCursor
  109. ldrb r0, [r3]
  110. lsls r5, r0, 4
  111. mov r0, r8 @ gDma3Requests
  112. adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]
  113. ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size
  114. ldr r2, [sp, 0x8]
  115. adds r0, r2, r0
  116. lsls r0, 16
  117. lsrs r0, 16
  118. str r0, [sp, 0x8]
  119. movs r0, 0xA0
  120. lsls r0, 8
  121. ldr r3, [sp, 0x8]
  122. cmp r3, r0
  123. bls _08000C50
  124. b _08000E46
  125. _08000C50:
  126. ldr r0, =REG_VCOUNT
  127. ldrb r0, [r0]
  128. cmp r0, 0xE0
  129. bls _08000C5A
  130. b _08000E46
  131. _08000C5A:
  132. ldrh r0, [r1, 0xA]
  133. cmp r0, 0x2
  134. beq _08000CD0
  135. cmp r0, 0x2
  136. bgt _08000C80
  137. cmp r0, 0x1
  138. beq _08000C8C
  139. b _08000DF0 // for 0
  140. .pool
  141. _08000C80:
  142. cmp r0, 0x3
  143. beq _08000D3C
  144. cmp r0, 0x4
  145. bne _08000C8A
  146. b _08000D88
  147. _08000C8A:
  148. b _08000DF0
  149. CASE 1
  150. _08000C8C:
  151. ldr r3, [r1]
  152. mov r2, r10
  153. adds r0, r5, r2
  154. ldr r2, [r0]
  155. ldrh r1, [r1, 0x8]
  156. cmp r1, r6
  157. bhi _08000CA6
  158. str r3, [r7]
  159. str r2, [r7, 0x4]
  160. lsrs r0, r1, 2
  161. movs r1, 0x84
  162. lsls r1, 24
  163. b _08000DAA
  164. _08000CA6:
  165. ldr r4, =REG_DMA3
  166. str r3, [r4]
  167. str r2, [r4, 0x4]
  168. ldr r0, =0x84000400
  169. str r0, [r4, 0x8]
  170. ldr r0, [r4, 0x8]
  171. adds r3, r6
  172. adds r2, r6
  173. subs r1, r6
  174. cmp r1, r6
  175. bhi _08000CA6
  176. str r3, [r4]
  177. str r2, [r4, 0x4]
  178. lsrs r0, r1, 2
  179. movs r1, 0x84
  180. lsls r1, 24
  181. b _08000D76
  182. .pool
  183.  
  184. _08000CD0:
  185. mov r3, r10
  186. adds r0, r5, r3
  187. ldr r4, [r0]
  188. ldrh r1, [r1, 0x8]
  189. cmp r1, r6
  190. bhi _08000CF4
  191. mov r0, r8
  192. adds r0, 0xC
  193. adds r0, r5, r0
  194. ldr r0, [r0]
  195. str r0, [sp]
  196. mov r5, sp
  197. str r5, [r7]
  198. str r4, [r7, 0x4]
  199. lsrs r0, r1, 2
  200. movs r1, 0x85
  201. lsls r1, 24
  202. b _08000DAA
  203. _08000CF4:
  204. mov r2, r12
  205. ldrb r0, [r2]
  206. lsls r0, 4
  207. mov r5, r8
  208. adds r5, 0xC
  209. adds r0, r5
  210. ldr r0, [r0]
  211. str r0, [sp]
  212. ldr r3, =REG_DMA3
  213. mov r0, sp
  214. str r0, [r3]
  215. str r4, [r3, 0x4]
  216. ldr r0, =0x85000400
  217. str r0, [r3, 0x8]
  218. ldr r0, [r3, 0x8]
  219. adds r4, r6
  220. subs r1, r6
  221. cmp r1, r6
  222. bhi _08000CF4
  223. ldrb r0, [r2]
  224. lsls r0, 4
  225. adds r0, r5
  226. ldr r0, [r0]
  227. str r0, [sp]
  228. mov r2, sp
  229. str r2, [r3]
  230. str r4, [r3, 0x4]
  231. lsrs r0, r1, 2
  232. movs r1, 0x85
  233. lsls r1, 24
  234. b _08000DEA
  235. .pool
  236.  
  237. _08000D3C:
  238. ldr r3, [r1]
  239. mov r2, r10
  240. adds r0, r5, r2
  241. ldr r2, [r0]
  242. ldrh r1, [r1, 0x8]
  243. cmp r1, r6
  244. bhi _08000D56
  245. str r3, [r7]
  246. str r2, [r7, 0x4]
  247. lsrs r0, r1, 1
  248. movs r1, 0x80
  249. lsls r1, 24
  250. b _08000DAA
  251. _08000D56:
  252. ldr r4, =REG_DMA3
  253. str r3, [r4]
  254. str r2, [r4, 0x4]
  255. ldr r0, =0x80000800
  256. str r0, [r4, 0x8]
  257. ldr r0, [r4, 0x8]
  258. adds r3, r6
  259. adds r2, r6
  260. subs r1, r6
  261. cmp r1, r6
  262. bhi _08000D56
  263. str r3, [r4]
  264. str r2, [r4, 0x4]
  265. lsrs r0, r1, 1
  266. movs r1, 0x80
  267. lsls r1, 24
  268. _08000D76:
  269. orrs r0, r1
  270. str r0, [r4, 0x8]
  271. ldr r0, [r4, 0x8]
  272. b _08000DF0
  273. .pool
  274.  
  275. _08000D88:
  276. mov r3, r10
  277. adds r0, r5, r3
  278. ldr r2, [r0]
  279. ldrh r4, [r1, 0x8]
  280. add r1, sp, 0x4
  281. cmp r4, r6
  282. bhi _08000DB2
  283. mov r0, r8
  284. adds r0, 0xC
  285. adds r0, r5, r0
  286. ldr r0, [r0]
  287. strh r0, [r1]
  288. str r1, [r7]
  289. str r2, [r7, 0x4]
  290. lsrs r0, r4, 1
  291. movs r1, 0x81
  292. lsls r1, 24
  293. _08000DAA:
  294. orrs r0, r1
  295. str r0, [r7, 0x8]
  296. ldr r0, [r7, 0x8]
  297. b _08000DF0
  298. _08000DB2:
  299. mov r5, r12
  300. ldrb r0, [r5]
  301. lsls r0, 4
  302. ldr r3, =gUnknown_0300001C
  303. adds r0, r3
  304. ldr r0, [r0]
  305. strh r0, [r1]
  306. ldr r3, =REG_DMA3
  307. str r1, [r3]
  308. str r2, [r3, 0x4]
  309. ldr r0, =0x81000800
  310. str r0, [r3, 0x8]
  311. ldr r0, [r3, 0x8]
  312. adds r2, r6
  313. subs r4, r6
  314. cmp r4, r6
  315. bhi _08000DB2
  316. ldrb r0, [r5]
  317. lsls r0, 4
  318. ldr r5, =gUnknown_0300001C
  319. adds r0, r5
  320. ldr r0, [r0]
  321. strh r0, [r1]
  322. str r1, [r3]
  323. str r2, [r3, 0x4]
  324. lsrs r0, r4, 1
  325. movs r1, 0x81
  326. lsls r1, 24
  327. _08000DEA:
  328. orrs r0, r1
  329. str r0, [r3, 0x8]
  330. ldr r0, [r3, 0x8]
  331. _08000DF0:
  332. ldr r1, =gDma3Requests
  333. mov r3, r12
  334. ldrb r0, [r3]
  335. lsls r0, 4
  336. adds r0, r1
  337. mov r2, r9
  338. str r2, [r0]
  339. ldrb r0, [r3]
  340. lsls r0, 4
  341. add r0, r10
  342. str r2, [r0]
  343. ldrb r0, [r3]
  344. lsls r0, 4
  345. adds r0, r1
  346. movs r4, 0
  347. strh r2, [r0, 0x8]
  348. ldrb r0, [r3]
  349. lsls r0, 4
  350. adds r0, r1
  351. mov r5, r9
  352. strh r5, [r0, 0xA]
  353. ldrb r0, [r3]
  354. lsls r0, 4
  355. adds r1, 0xC
  356. adds r0, r1
  357. mov r1, r9
  358. str r1, [r0]
  359. ldrb r0, [r3]
  360. adds r0, 0x1
  361. strb r0, [r3]
  362. lsls r0, 24
  363. cmp r0, 0
  364. bge _08000E34
  365. strb r4, [r3]
  366. _08000E34:
  367. mov r2, r12
  368. ldrb r0, [r2]
  369. lsls r0, 4
  370. ldr r3, =gDma3Requests
  371. adds r0, r3
  372. ldrh r0, [r0, 0x8]
  373. cmp r0, 0
  374. beq _08000E46
  375. b _08000C2E
  376. _08000E46:
  377. add sp, 0xC
  378. pop {r3-r5}
  379. mov r8, r3
  380. mov r9, r4
  381. mov r10, r5
  382. pop {r4-r7}
  383. pop {r0}
  384. bx r0
  385. .pool
  386. thumb_func_end ProcessDma3Requests
  387. */
  388.  
  389. compiler:
  390. ProcessDma3Requests:
  391. push {r4, r5, r6, r7, lr}
  392. mov r7, sl
  393. mov r6, r9
  394. mov r5, r8
  395. push {r5, r6, r7}
  396. add sp, sp, #0xfffffff4
  397. ldr r0, .L44
  398. ldrb r0, [r0]
  399. cmp r0, #0
  400. beq .LCB60
  401. b .L10 @long jump
  402. .LCB60:
  403. mov r0, #0x0
  404. str r0, [sp, #0x8]
  405. ldr r1, .L44+0x4
  406. ldr r2, .L44+0x8
  407. ldrb r0, [r2]
  408. lsl r0, r0, #0x4
  409. add r0, r0, r1
  410. ldrh r0, [r0, #0x8]
  411. cmp r0, #0
  412. bne .LCB74
  413. b .L10 @long jump
  414. .LCB74:
  415. add r1, r1, #0x4
  416. mov sl, r1
  417. mov r2, #0x80
  418. lsl r2, r2, #0x5
  419. mov r8, r2
  420. ldr r0, .L44+0xc
  421. mov ip, r0
  422. mov r1, #0x0
  423. mov r9, r1
  424. .L14:
  425. ldr r2, .L44+0x8
  426. ldrb r0, [r2]
  427. lsl r5, r0, #0x4
  428. ldr r0, .L44+0x4
  429. add r1, r5, r0
  430. ldrh r0, [r1, #0x8]
  431. ldr r2, [sp, #0x8]
  432. add r0, r2, r0
  433. lsl r0, r0, #0x10
  434. lsr r0, r0, #0x10
  435. str r0, [sp, #0x8]
  436. mov r0, #0xa0
  437. lsl r0, r0, #0x8
  438. ldr r2, [sp, #0x8]
  439. cmp r2, r0
  440. bls .LCB109
  441. b .L10 @long jump
  442. .LCB109:
  443. ldr r0, .L44+0x10
  444. ldrh r0, [r0]
  445. cmp r0, #0xe0
  446. bls .LCB115
  447. b .L10 @long jump
  448. .LCB115:
  449. ldrh r0, [r1, #0xa]
  450. cmp r0, #0x2
  451. beq .L23 @cond_branch
  452. cmp r0, #0x2
  453. bgt .L40 @cond_branch
  454. cmp r0, #0x1
  455. beq .L18 @cond_branch
  456. b .L17
  457. .L45:
  458. .align 2, 0
  459. .L44:
  460. .word gDma3ManagerLocked
  461. .word gDma3Requests
  462. .word gDma3RequestCursor
  463. .word 0x40000d4
  464. .word 0x4000006
  465. .L40:
  466. cmp r0, #0x3
  467. beq .L28 @cond_branch
  468. cmp r0, #0x4
  469. beq .L33 @cond_branch
  470. b .L17
  471. .L18:
  472. ldrh r4, [r1, #0x8]
  473. ldr r2, [r1]
  474. mov r1, sl
  475. add r0, r5, r1
  476. ldr r1, [r0]
  477. cmp r4, r8
  478. bls .L20 @cond_branch
  479. ldr r5, .L46
  480. ldr r6, .L46+0x4
  481. mov r3, #0x80
  482. lsl r3, r3, #0x5
  483. .L21:
  484. str r2, [r5]
  485. str r1, [r5, #0x4]
  486. str r6, [r5, #0x8]
  487. ldr r0, [r5, #0x8]
  488. add r2, r2, r3
  489. add r1, r1, r3
  490. sub r4, r4, r3
  491. cmp r4, r3
  492. bhi .L21 @cond_branch
  493. .L20:
  494. mov r0, ip
  495. str r2, [r0]
  496. str r1, [r0, #0x4]
  497. lsr r0, r4, #0x2
  498. mov r1, #0x84
  499. lsl r1, r1, #0x18
  500. b .L43
  501. .L47:
  502. .align 2, 0
  503. .L46:
  504. .word 0x40000d4
  505. .word 0x84000400
  506. .L23:
  507. ldrh r3, [r1, #0x8]
  508. mov r2, sl
  509. add r0, r5, r2
  510. ldr r4, [r0]
  511. cmp r3, r8
  512. bls .L25 @cond_branch
  513. ldr r0, .L48
  514. add r6, r5, r0
  515. ldr r1, .L48+0x4
  516. mov r5, #0x80
  517. lsl r5, r5, #0x5
  518. ldr r2, .L48+0x8
  519. .L26:
  520. ldr r0, [r6]
  521. str r0, [sp]
  522. mov r0, sp
  523. str r0, [r1]
  524. str r4, [r1, #0x4]
  525. str r2, [r1, #0x8]
  526. ldr r0, [r1, #0x8]
  527. add r4, r4, r5
  528. sub r3, r3, r5
  529. cmp r3, r5
  530. bhi .L26 @cond_branch
  531. .L25:
  532. ldr r1, .L48+0xc
  533. ldrb r0, [r1]
  534. lsl r0, r0, #0x4
  535. ldr r2, .L48
  536. add r0, r0, r2
  537. ldr r0, [r0]
  538. str r0, [sp]
  539. mov r0, sp
  540. mov r1, ip
  541. str r0, [r1]
  542. str r4, [r1, #0x4]
  543. lsr r0, r3, #0x2
  544. mov r1, #0x85
  545. lsl r1, r1, #0x18
  546. orr r0, r0, r1
  547. mov r2, ip
  548. str r0, [r2, #0x8]
  549. ldr r0, [r2, #0x8]
  550. b .L17
  551. .L49:
  552. .align 2, 0
  553. .L48:
  554. .word gDma3Requests+0xc
  555. .word 0x40000d4
  556. .word 0x85000400
  557. .word gDma3RequestCursor
  558. .L28:
  559. ldrh r4, [r1, #0x8]
  560. ldr r2, [r1]
  561. mov r1, sl
  562. add r0, r5, r1
  563. ldr r1, [r0]
  564. cmp r4, r8
  565. bls .L30 @cond_branch
  566. ldr r5, .L50
  567. ldr r6, .L50+0x4
  568. mov r3, #0x80
  569. lsl r3, r3, #0x5
  570. .L31:
  571. str r2, [r5]
  572. str r1, [r5, #0x4]
  573. str r6, [r5, #0x8]
  574. ldr r0, [r5, #0x8]
  575. add r2, r2, r3
  576. add r1, r1, r3
  577. sub r4, r4, r3
  578. cmp r4, r3
  579. bhi .L31 @cond_branch
  580. .L30:
  581. mov r0, ip
  582. str r2, [r0]
  583. str r1, [r0, #0x4]
  584. lsr r0, r4, #0x1
  585. mov r1, #0x80
  586. lsl r1, r1, #0x18
  587. b .L43
  588. .L51:
  589. .align 2, 0
  590. .L50:
  591. .word 0x40000d4
  592. .word 0x80000800
  593. .L33:
  594. ldrh r3, [r1, #0x8]
  595. mov r2, sl
  596. add r0, r5, r2
  597. ldr r4, [r0]
  598. add r2, sp, #0x4
  599. cmp r3, r8
  600. bls .L35 @cond_branch
  601. add r6, r2, #0
  602. ldr r0, .L52
  603. add r5, r5, r0
  604. ldr r1, .L52+0x4
  605. ldr r7, .L52+0x8
  606. .L36:
  607. ldr r0, [r5]
  608. strh r0, [r6]
  609. str r6, [r1]
  610. str r4, [r1, #0x4]
  611. str r7, [r1, #0x8]
  612. ldr r0, [r1, #0x8]
  613. add r4, r4, r8
  614. mov r0, r8
  615. sub r3, r3, r0
  616. cmp r3, r8
  617. bhi .L36 @cond_branch
  618. .L35:
  619. ldr r1, .L52+0xc
  620. ldrb r0, [r1]
  621. lsl r0, r0, #0x4
  622. ldr r1, .L52
  623. add r0, r0, r1
  624. ldr r0, [r0]
  625. strh r0, [r2]
  626. mov r0, ip
  627. str r2, [r0]
  628. str r4, [r0, #0x4]
  629. lsr r0, r3, #0x1
  630. mov r1, #0x81
  631. lsl r1, r1, #0x18
  632. .L43:
  633. orr r0, r0, r1
  634. mov r1, ip
  635. str r0, [r1, #0x8]
  636. ldr r0, [r1, #0x8]
  637. .L17:
  638. ldr r1, .L52+0x10
  639. ldr r3, .L52+0xc
  640. ldrb r0, [r3]
  641. lsl r0, r0, #0x4
  642. add r0, r0, r1
  643. mov r2, r9
  644. str r2, [r0]
  645. ldrb r0, [r3]
  646. lsl r0, r0, #0x4
  647. add r0, r0, sl
  648. str r2, [r0]
  649. ldrb r0, [r3]
  650. lsl r0, r0, #0x4
  651. add r0, r0, r1
  652. mov r4, #0x0
  653. strh r2, [r0, #0x8]
  654. ldrb r0, [r3]
  655. lsl r0, r0, #0x4
  656. add r0, r0, r1
  657. mov r1, r9
  658. strh r1, [r0, #0xa]
  659. ldrb r0, [r3]
  660. lsl r0, r0, #0x4
  661. ldr r2, .L52
  662. add r0, r0, r2
  663. mov r1, r9
  664. str r1, [r0]
  665. ldrb r0, [r3]
  666. add r0, r0, #0x1
  667. strb r0, [r3]
  668. lsl r0, r0, #0x18
  669. cmp r0, #0
  670. bge .L12 @cond_branch
  671. strb r4, [r3]
  672. .L12:
  673. ldr r2, .L52+0xc
  674. ldrb r0, [r2]
  675. lsl r0, r0, #0x4
  676. ldr r1, .L52+0x10
  677. add r0, r0, r1
  678. ldrh r0, [r0, #0x8]
  679. cmp r0, #0
  680. beq .LCB428
  681. b .L14 @long jump
  682. .LCB428:
  683. .L10:
  684. add sp, sp, #0xc
  685. pop {r3, r4, r5}
  686. mov r8, r3
  687. mov r9, r4
  688. mov sl, r5
  689. pop {r4, r5, r6, r7}
  690. pop {r0}
  691. bx r0
  692. .L53:
  693. .align 2, 0
  694. .L52:
  695. .word gDma3Requests+0xc
  696. .word 0x40000d4
  697. .word 0x81000800
  698. .word gDma3RequestCursor
  699. .word gDma3Requests
  700. .Lfe2:
  701. .size ProcessDma3Requests,.Lfe2-ProcessDma3Requests
  702. .text
  703. .align 2, 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement