gba.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. incdir "tests"
  2. include "dsp_base.inc"
  3. ; We'll let dsp_base.inc catch exceptions
  4. ;nop
  5. ;nop
  6. ;nop
  7. ;nop
  8. ;nop
  9. ;nop
  10. ;nop
  11. ;nop
  12. ;nop
  13. ;nop
  14. ;nop
  15. ;nop
  16. ;nop
  17. ;halt
  18. ;rti
  19. ;halt
  20. sbset #0x06
  21. sbclr #0x03
  22. sbclr #0x04
  23. sbset #0x05
  24. lri $CR, #0x00ff
  25. lri $WR0, #0xffff
  26. lri $WR1, #0xffff
  27. lri $WR2, #0xffff
  28. lri $WR3, #0xffff
  29. set40
  30. m0
  31. clr15
  32. ;step 1: context setup
  33. call send_back
  34. call 0x807e ; loop until DSP->CPU mailbox is empty
  35. si @DMBH, #0xdcd1
  36. si @DMBL, #0x0000 ; sendmail 0xdcd10000
  37. si @DIRQ, #0x0001
  38. ; wait for CPU mail == 0xabbaxxxx
  39. wait_cpu_init:
  40. call 0x8078
  41. lrs $AC0.L, @CMBL
  42. cmpi $AC0.M, #0xabba
  43. jnz wait_cpu_init
  44. ; Next mail has the mram addr of the data to fetch
  45. set16
  46. call 0x8078
  47. lrs $AX0.L, @CMBL
  48. andi $AC0.M, #0x0fff
  49. mrr $AX0.H, $AC0.M
  50. lri $AX1.H, #0x0000 ; DSP-DRAM addr
  51. lri $AX1.L, #0x0020 ; length (32 bytes = 16 words, word 9 and 10 are addr where result should DMA'd to in main mem)
  52. lri $IX3, #0x0000 ; there will be no ucode/iram upload
  53. lri $AR0, #do_main ; return addr after DRAM upload
  54. jmp 0x80bc ; DRAM upload !!
  55. ; $AX0.H-$AX0.L - CPU(PPC) addr = mail & 0x0fffffff
  56. ; upload data from mainmem to DSP DRAM and jump to 0x41 after that
  57. ; ucode addr 0x0041
  58. do_main:
  59. ;step 2: got data from CPU, before going into BigCrazyFunction
  60. call send_back
  61. call BigCrazyFunction ; <<------------- main crap is here!!!!!!!!!
  62. call 0x807e ; loop until DSP->CPU mailbox is empty
  63. si @DMBH, #0xdcd1
  64. si @DMBL, #0x0003 ; sendmail 0xdcd10003 (aka... calc is over, result is in main mem now)
  65. si @DIRQ, #0x0001
  66. set40
  67. ; wait for CPU to tell us what to do after calc'ing
  68. wait_cpu_end:
  69. call 0x8078
  70. cmpi $AC0.M, #0xcdd1
  71. jnz wait_cpu_end
  72. lrs $AC0.M, @CMBL
  73. cmpi $AC0.M, #0x0001
  74. jz PrepareBootUcode ; if CPU->DSP mail was 0xcdd10001 -> 005e_PrepareBootUcode()
  75. cmpi $AC0.M, #0x0002
  76. jz 0x8000 ; if CPU->DSP mail was 0xcdd10002 -> DSP reset ( jmp to irom(0x8000))
  77. ; THIS IS CUSTOM CODE
  78. cmpi $AC0.M, #0xbabe
  79. jz end_of_test ; wait for DSP to be reset by CPU
  80. jmp wait_cpu_end ; wait for next mail from CPU
  81. halt
  82. PrepareBootUcode:
  83. set16
  84. call 0x8078
  85. lrs $AC0.L, @CMBL
  86. call 0x8078
  87. lrs $AC0.L, @CMBL
  88. call 0x8078
  89. lrs $AC0.L, @CMBL
  90. call 0x8078
  91. lr $IX1, @CMBL
  92. andi $AC0.M, #0x0fff
  93. mrr $IX0, $AC0.M
  94. call 0x8078
  95. lr $IX3, @CMBL
  96. call 0x8078
  97. lr $IX2, @CMBL
  98. call 0x8078
  99. lr $AR0, @CMBL
  100. call 0x8078
  101. lrs $AX0.L, @CMBL
  102. andi $AC0.M, #0x0fff
  103. mrr $AX0.H, $AC0.M
  104. call 0x8078
  105. lrs $AX1.L, @CMBL
  106. call 0x8078
  107. lrs $AX1.H, @CMBL
  108. sbclr #0x05
  109. sbclr #0x06
  110. jmp 0x80b5 ; BootUcode()
  111. halt
  112. ; does some crazy stuff with data at DRAM @0x3/0x5/0x6/0x7 with help of some values from drom :)
  113. ; result is @0x22,@0x23 and written back to main memory to dmem-0x08:dmem-0x09
  114. BigCrazyFunction:
  115. ; {
  116. clr $ACC0
  117. lri $AR1, #0x0010
  118. loopi #0x20
  119. srri @$AR1, $AC0.M
  120. call send_back ;3
  121. lr $AC1.M, @0x1456
  122. call send_back
  123. andi $AC1.M, #0xffd0
  124. call send_back
  125. clrp'mv : $AX1.L, $AC1.M ; assembler doesn't like .m here
  126. call send_back
  127. lri $AR0, #0x0000
  128. call send_back
  129. lri $IX2, #0x0000
  130. call send_back
  131. lri $AR2, #0x001f
  132. call send_back
  133. lr $AC0.M, @0x15f6
  134. call send_back
  135. lsl $ACC0, #8
  136. call send_back
  137. lr $AC1.M, @0x1766
  138. call send_back
  139. andi $AC1.M, #0x00ff
  140. call send_back
  141. mrr $AX0.H, $AC1.M
  142. call send_back
  143. call 0x88e5
  144. call send_back
  145. mrr $AX0.L, $AC0.L
  146. call send_back
  147. clr'mv $ACC0 : $AX1.H, $AC0.M ; assembler doesn't like .m here
  148. call send_back
  149. lrri $AC0.M, @$AR0
  150. call send_back
  151. lsr $ACC0, #-8
  152. call send_back
  153. mrr $AC1.M, $AC0.L
  154. call send_back
  155. mrr $AX0.H, $AC0.M
  156. call send_back
  157. call 0x8809
  158. call send_back
  159. call 0x8723
  160. call send_back
  161. dar $AR2
  162. call send_back
  163. clr'dr $ACC0 : $AR2
  164. call send_back
  165. lr $AC0.M, @0x166c
  166. call send_back
  167. lsl $ACC0, #4
  168. call send_back
  169. andi $AC0.M, #0xff00
  170. call send_back
  171. lr $AC1.M, @0x1231
  172. call send_back
  173. lsr $ACC1, #-8
  174. call send_back
  175. andi $AC1.M, #0x00ff
  176. call send_back
  177. mrr $AX0.H, $AC1.M
  178. call send_back
  179. call 0x88e5
  180. call send_back
  181. mrr $AX0.L, $AC0.L
  182. call send_back
  183. clr'mv $ACC0 : $AX1.H, $AC0.M ; assembler doesn't like .m here
  184. call send_back
  185. lrri $AC0.M, @$AR0
  186. call send_back
  187. lsr $ACC0, #-8
  188. call send_back
  189. mrr $AC1.M, $AC0.L
  190. call send_back
  191. mrr $AX0.H, $AC0.M
  192. call send_back
  193. call 0x8809
  194. call send_back
  195. call 0x8723
  196. call send_back
  197. clr $ACC0
  198. call send_back
  199. clr $ACC1
  200. call send_back
  201. lr $AC1.H, @0x0005
  202. call send_back
  203. asr16 $ACC1
  204. call send_back
  205. cmp
  206. call send_back ;46
  207. jz Unk_00e5
  208. call send_back ;47
  209. jl Unk_00f3
  210. call send_back ;48
  211. ; if ( > ) {
  212. ; length 12
  213. lri $AR2, #0x0010
  214. call send_back
  215. lri $IX2, #0x0001
  216. call send_back
  217. lr $AC0.H, @0x171b
  218. call send_back
  219. asr16 $ACC0
  220. call send_back
  221. neg $ACC1
  222. call send_back
  223. add $ACC1, $ACC0
  224. call send_back
  225. lsl $ACC1, #1
  226. call send_back
  227. mrr $AX0.H, $AC1.M
  228. call send_back
  229. lr $AC1.M, @0x0003
  230. call send_back
  231. lsl $ACC1, #4
  232. call send_back
  233. call 0x8809
  234. call send_back
  235. jmp Unk_0102
  236. call send_back ;60
  237. ; } else if ( == 0) {
  238. ; length 8
  239. Unk_00e5:
  240. lri $AR2, #0x0011
  241. call send_back
  242. lr $AC1.M, @0x0003
  243. call send_back
  244. lsl $ACC1, #1
  245. call send_back
  246. mrr $AX0.H, $AC1.M
  247. call send_back
  248. lr $AC0.M, @0x1043
  249. call send_back
  250. andi $AC0.M, #0xfff0
  251. call send_back
  252. call 0x88e5
  253. call send_back ;53
  254. jmp Unk_0102
  255. ; } else if ( < ) {
  256. ; length 10
  257. Unk_00f3:
  258. lri $AR2, #0x0010
  259. call send_back
  260. lri $IX2, #0x0001
  261. call send_back
  262. lr $AC0.H, @0x1285
  263. call send_back
  264. asr16 $ACC0
  265. call send_back
  266. add $ACC1, $ACC0
  267. call send_back
  268. lsl $ACC1, #1
  269. call send_back
  270. lr $AC0.M, @0x0003
  271. call send_back
  272. lsl $ACC0, #4
  273. call send_back
  274. mrr $AX0.H, $AC0.M
  275. call send_back
  276. call 0x8809
  277. call send_back ;57
  278. ; }
  279. Unk_0102:
  280. lri $AR3, #0x0013
  281. call send_back ; either step 60, 53, 57
  282. srri @$AR3, $AC0.M
  283. call send_back
  284. clr's $ACC1 : @$AR3, $AC0.L
  285. call send_back
  286. lri $AR3, #0x0013
  287. call send_back
  288. lr $AC1.M, @0x0007
  289. call send_back
  290. lr $AC0.M, @0x11b8
  291. call send_back
  292. andi $AC0.M, #0xfff0 ;66
  293. call send_back
  294. mrr $AX0.H, $AC0.M
  295. call send_back
  296. ;call 0x81f4
  297. mulxac'mv $AX0.H, $AX1.L, $ACC1 : $AX1.H, $AC0.M
  298. call send_back
  299. asr16'ir $ACC1 : $AR1
  300. call send_back ;66
  301. srri @$AR3, $AC1.M
  302. call send_back
  303. clr's $ACC0 : @$AR3, $AC1.L
  304. call send_back
  305. lsl16 $ACC1
  306. call send_back
  307. ;call 0x8458 ;66
  308. mulxac'mv $AX0.H, $AX1.L, $ACC1 : $AX1.H, $AC0.M
  309. call send_back
  310. asr16 $ACC1
  311. call send_back
  312. srri @$AR3, $AC1.M
  313. call send_back
  314. clr's $ACC0 : @$AR3, $AC1.L
  315. call send_back
  316. call send_back
  317. set40
  318. call send_back
  319. lri $AR2, #0x0015
  320. call send_back
  321. lr $AC0.M, @0x0006
  322. call send_back
  323. lr $AX0.H, @0x165b
  324. call send_back
  325. call 0x88e5
  326. call send_back
  327. asr $ACC0, #-3
  328. call send_back
  329. lsl $ACC0, #3
  330. call send_back
  331. srri @$AR2, $AC0.M
  332. call send_back
  333. srri @$AR2, $AC0.L
  334. call send_back
  335. lri $AR2, #0x0016
  336. call send_back
  337. lr $AC0.M, @0x1723
  338. call send_back
  339. asr $ACC0, #-12
  340. call send_back
  341. lr $AX0.H, @0x166b
  342. call send_back
  343. call 0x88e5
  344. call send_back
  345. tst $ACC0
  346. call send_back
  347. jge Unk_012e
  348. call send_back
  349. clr $ACC0
  350. call send_back
  351. Unk_012e:
  352. asr $ACC0, #-3
  353. call send_back
  354. set16
  355. ;step 4
  356. call send_back
  357. lr $AC1.M, @0x1491
  358. call send_back
  359. andi $AC1.M, #0xd0f0
  360. call send_back
  361. mrr $IX1, $AC1.M
  362. call send_back
  363. lr $AC1.M, @0x1468
  364. call send_back
  365. lr $AC1.H, @0x11fc
  366. call send_back
  367. lsr $ACC1, #-4
  368. call send_back
  369. mrr $IX2, $AC1.M
  370. call send_back
  371. lr $AC1.H, @0x11b8
  372. call send_back
  373. asr16 $ACC1
  374. call send_back
  375. lsl $ACC0, #24
  376. call send_back
  377. lsr $ACC0, #-8
  378. call send_back
  379. mrr $AX0.H, $AC0.M
  380. call send_back
  381. mrr $AC1.M, $AC0.M
  382. call send_back
  383. mrr $AX1.H, $IX1
  384. call send_back
  385. andr $AC0.M, $AX1.H
  386. call send_back
  387. lsl $ACC0, #2
  388. call send_back
  389. mrr $AX1.H, $IX2
  390. call send_back
  391. andr $AC1.M, $AX1.H
  392. call send_back
  393. lsl $ACC1, #1
  394. call send_back
  395. add $ACC0, $ACC1
  396. call send_back
  397. lsl $ACC1, #24
  398. call send_back
  399. asr16 $ACC1
  400. call send_back
  401. andr $AC1.M, $AX0.H
  402. call send_back
  403. add $ACC0, $ACC1
  404. call send_back
  405. lr $AC1.M, @0x0012
  406. call send_back
  407. orc $AC1.M, $AC0.M
  408. call send_back
  409. sr @0x0012, $AC1.M
  410. call send_back
  411. lsr $ACC0, #-16
  412. call send_back
  413. lr $AC1.M, @0x0011
  414. call send_back
  415. orc $AC1.M, $AC0.M
  416. call send_back
  417. sr @0x0011, $AC1.M
  418. call send_back
  419. mrr $AC1.L, $IX1
  420. call send_back
  421. lsl $ACC1, #1
  422. call send_back
  423. mrr $AC1.M, $IX2
  424. call send_back
  425. lsl16 $ACC1
  426. call send_back
  427. asr $ACC1, #-8
  428. call send_back
  429. lsr16 $ACC1
  430. call send_back
  431. mrr $AX0.H, $AC1.M
  432. call send_back
  433. mrr $AX1.H, $AC1.L
  434. call send_back
  435. clr $ACC0
  436. call send_back
  437. lr $AC0.M, @0x0011
  438. call send_back
  439. andr $AC0.M, $AX0.H
  440. call send_back
  441. clr $ACC1
  442. call send_back
  443. lr $AC1.M, @0x0012
  444. call send_back
  445. andr $AC1.M, $AX0.H
  446. call send_back
  447. add $ACC0, $ACC1
  448. call send_back
  449. lr $AC1.M, @0x0012
  450. call send_back
  451. lsr $ACC1, #-8
  452. call send_back
  453. add $ACC0, $ACC1
  454. call send_back
  455. call send_back
  456. clr $ACC1
  457. call send_back
  458. mrr $AC1.M, $AC0.M
  459. call send_back
  460. lsl $ACC1, #8
  461. call send_back
  462. orr $AC1.M, $AX1.H
  463. call send_back
  464. lr $AC0.M, @0x0011
  465. call send_back
  466. orc $AC0.M, $AC1.M
  467. call send_back
  468. lr $AC1.M, @0x0012
  469. call send_back
  470. orr $AC1.M, $AX1.H
  471. call send_back
  472. mrr $IX1, $AC1.M
  473. call send_back
  474. lr $AX0.H, @0x15f1
  475. call send_back
  476. andr $AC1.M, $AX0.H
  477. call send_back
  478. jz else_0192
  479. call send_back
  480. ; if () {
  481. lr $AC1.M, @0x10e2
  482. call send_back
  483. lsl $ACC1, #8
  484. call send_back
  485. mrr $AX0.H, $AC1.M
  486. call send_back
  487. lr $AC1.M, @0x103b
  488. call send_back
  489. decm $AC1.M
  490. call send_back
  491. orr $AC1.M, $AX0.H
  492. call send_back
  493. xorc $AC0.M, $AC1.M
  494. call send_back
  495. sr @0x0022, $AC0.M
  496. call send_back
  497. lr $AC0.L, @0x1229
  498. call send_back
  499. lr $AC1.L, @0x11f8
  500. call send_back
  501. sub $ACC0, $ACC1
  502. call send_back
  503. lsl16 $ACC0
  504. call send_back
  505. mrr $AC1.M, $IX1
  506. call send_back
  507. xorc $AC0.M, $AC1.M
  508. call send_back
  509. jmp Unk_01a5
  510. call send_back
  511. ; } else {
  512. else_0192:
  513. lr $AC1.M, @0x10ca
  514. call send_back
  515. lsl $ACC1, #8
  516. call send_back
  517. mrr $AX0.H, $AC1.M
  518. call send_back
  519. lr $AC1.M, @0x1043
  520. call send_back
  521. incm $AC1.M
  522. call send_back
  523. orr $AC1.M, $AX0.H
  524. call send_back
  525. xorc $AC0.M, $AC1.M
  526. call send_back
  527. sr @0x0022, $AC0.M
  528. call send_back
  529. lr $AC0.L, @0x1259
  530. call send_back
  531. lr $AC1.L, @0x16fe
  532. call send_back
  533. add $ACC0, $ACC1
  534. call send_back
  535. lsl16 $ACC0
  536. call send_back
  537. mrr $AC1.M, $IX1
  538. call send_back
  539. xorc $AC0.M, $AC1.M
  540. call send_back
  541. ; }
  542. Unk_01a5:
  543. ; this is where result is written to main memory
  544. ; DSP mem 0x20-0x23 (8 bytes) are written back (DMA limitation),
  545. ; but only values @22 and @23 were modified (result is 32bit)
  546. sr @0x0023, $AC0.M
  547. call send_back
  548. lr $AX0.H, @0x0008 ; CPU addr high
  549. call send_back
  550. lr $AX0.L, @0x0009 ; CPU addr low
  551. call send_back
  552. lri $AX1.H, #0x0020 ; DSP addr
  553. call send_back
  554. lri $AX1.L, #0x0008 ; length
  555. call send_back
  556. lri $IX3, #0x0000 ; there will be no iram DMA
  557. call send_back
  558. call 0x808b ; DRAM->CPU <<<--- important!!
  559. call send_back
  560. ret
  561. ; }
  562. ; Free some space for the TROJAN CODEZ
  563. ;nop
  564. ;nop
  565. ;nop
  566. ;nop
  567. ;nop
  568. ;nop
  569. ;nop
  570. ;nop
  571. ;nop
  572. ;nop
  573. ;nop
  574. ;nop