Advertisement
Zoinkity

Pocket Monster Stadium GB Emu RSP code

Feb 5th, 2016
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.95 KB | None | 0 0
  1. 8111E678 A4001000 RSP microcode: GB 16bit video emulation
  2. LW GP,0FD8 (R0)
  3. ORI A0,R0,0A00 ;RSP= A4000A00
  4. LW A1,0FF0 (R0)
  5. ORI A2,R0,047F ;0x480 bytes
  6. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  7. ADDIU A1,A1,0080 ;A1= @A4000FF0 + 0x80
  8. ORI T0,R0,009C
  9. SW R0,0E80 (T0)
  10. BGTZ T0,A400101C
  11. ADDIU T0,T0,FFFC
  12. ORI T0,R0,008F
  13. ADDIU A1,GP,7B80 ;RDRAM= GP + 0x7B80
  14. ORI A0,R0,0E80 ;RSP= A4000E80
  15. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  16. ORI A2,R0,009F ;0xA0 bytes
  17. ADDIU A1,A1,00A0
  18. BGTZ T0,A4001034
  19. ADDIU T0,T0,FFFF
  20. ADDIU A1,GP,9A00 ;RDRAM= GP + 0x9A00
  21. ORI A0,R0,0000 ;RSP= A4000000
  22. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  23. ORI A2,R0,07FF ;0x800 bytes
  24. ADDIU T8,GP,1200
  25. ORI S7,R0,0007
  26. ORI S6,R0,0010
  27. ORI A0,R0,0800 ;RSP= A4000800
  28. OR A1,T8,R0 ;RDRAM= GP + 0x1200
  29. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  30. ORI A2,R0,01FF ;0x200 bytes
  31. ORI S5,R0,008F
  32. ORI T0,R0,D4E0
  33. ADDU K0,GP,T0
  34. SLL S4,S5,0x3
  35. LBU V0,0A00 (S4)
  36. LBU T3,0A01 (S4)
  37. OR T0,S6,S7
  38. ANDI T1,V0,0010
  39. XOR T0,T0,T1
  40. ANDI T1,T3,0007
  41. XOR T0,T0,T1
  42. BNE T0,R0,A40011E0
  43. ANDI T0,V0,0081
  44. XORI T0,T0,0081
  45. BNE T0,R0,A40011E0
  46. LBU A3,0A02 (S4)
  47. ANDI T1,V0,0008
  48. SLL T1,T1,0x7
  49. SRL T2,T3,0x3
  50. SLL T2,T2,0x5
  51. ADDU T1,T1,T2
  52. SRL T2,A3,0x3
  53. OR A0,T1,T2
  54. LBU T0,0000 (A0)
  55. ADDIU T2,T2,0001
  56. ANDI T2,T2,001F
  57. SLL T0,T0,0x1
  58. LHU T3,0800 (T0)
  59. OR A0,T1,T2
  60. ANDI T1,V0,00A0
  61. XORI T1,T1,00A0
  62. BNE T1,R0,A4001100
  63. ORI T0,R0,00A0
  64. LBU T0,0A07 (S4)
  65. ADDIU T0,T0,FFF9
  66. ANDI T1,A3,0007
  67. ADDU A2,T0,T1
  68. XORI A1,T1,0007
  69. ANDI T0,T3,8080
  70. SRL T1,T0,0xE
  71. SRL T0,T0,0x5
  72. OR T0,T0,T1
  73. SB T0,0E81 (A1)
  74. ANDI T0,T3,4040
  75. SRL T1,T0,0xD
  76. SRL T0,T0,0x4
  77. OR T0,T0,T1
  78. SB T0,0E82 (A1)
  79. ANDI T0,T3,2020
  80. SRL T1,T0,0xC
  81. SRL T0,T0,0x3
  82. OR T0,T0,T1
  83. SB T0,0E83 (A1)
  84. ANDI T0,T3,1010
  85. SRL T1,T0,0xB
  86. SRL T0,T0,0x2
  87. OR T0,T0,T1
  88. SB T0,0E84 (A1)
  89. ANDI T0,T3,0808
  90. SRL T1,T0,0xA
  91. SRL T0,T0,0x1
  92. OR T0,T0,T1
  93. SB T0,0E85 (A1)
  94. ANDI T0,T3,0404
  95. SRL T1,T0,0x9
  96. OR T0,T0,T1
  97. SB T0,0E86 (A1)
  98. ANDI T0,T3,0202
  99. SRL T1,T0,0x8
  100. SLL T0,T0,0x1
  101. OR T0,T0,T1
  102. SB T0,0E87 (A1)
  103. LBU T0,0000 (A0)
  104. ANDI T1,T3,0101
  105. SRL T2,T1,0x7
  106. SLL T1,T1,0x2
  107. OR T1,T1,T2
  108. SB T1,0E88 (A1)
  109. ADDIU T2,A0,0001
  110. ANDI T2,T2,001F
  111. ANDI T1,A0,07E0
  112. OR A0,T1,T2
  113. SLL T0,T0,0x1
  114. LHU T3,0800 (T0)
  115. ADDIU A2,A2,FFF8
  116. BGTZ A2,A400110C
  117. ADDIU A1,A1,0008
  118. ORI A0,R0,0E88 ;RSP= A4000E88
  119. OR A1,K0,R0 ;RDRAM= K0
  120. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  121. ORI A2,R0,009F ;0xA0 bytes
  122. ADDIU K0,K0,FF60
  123. ADDIU S4,S4,FFF8
  124. BGTZ S5,A4001084
  125. ADDIU S5,S5,FFFF
  126. BEQ S6,R0,A4001210
  127. NOP
  128. ORI A0,R0,0800 ;RSP= A4000800
  129. ADDIU A1,T8,1000 ;RDRAM= T8 + 0x1000
  130. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  131. ORI A2,R0,00FF ;0x100 bytes
  132. J A4001074
  133. XORI S6,S6,0010
  134. ADDIU T8,T8,FE00
  135. BGTZ S7,A4001060
  136. ADDIU S7,S7,FFFF
  137. ADDIU T8,GP,1200
  138. ORI S7,R0,0007
  139. ORI S6,R0,0010
  140. ORI A0,R0,0800 ;RSP= A4000800
  141. OR A1,T8,R0 ;RDRAM= GP + 0x1200
  142. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  143. ORI A2,R0,01FF ;0x200 bytes
  144. ORI S5,R0,008F
  145. ORI T0,R0,D4E0
  146. ADDU K0,GP,T0
  147. SLL S4,S5,0x3
  148. LBU V0,0A00 (S4)
  149. LBU T3,0A06 (S4)
  150. OR T0,S6,S7
  151. ANDI T1,V0,0010
  152. XOR T0,T0,T1
  153. ANDI T1,T3,0007
  154. XOR T0,T0,T1
  155. BNE T0,R0,A400137C
  156. ANDI T1,V0,00A1
  157. XORI T1,T1,00A1
  158. BNE T1,R0,A400137C
  159. LBU T4,0A07 (S4)
  160. ORI A2,R0,00A7
  161. SUBU A2,A2,T4
  162. BLEZ A2,A400137C
  163. ORI A0,R0,0E88 ;RSP= A4000E88
  164. OR A1,K0,R0 ;RDRAM= K0
  165. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  166. ORI A2,R0,009F ;0xA0 bytes
  167. ANDI T0,V0,0040
  168. SLL T0,T0,0x4
  169. SRL T1,T3,0x3
  170. SLL T1,T1,0x5
  171. ADDU A0,T0,T1
  172. LBU T0,0000 (A0)
  173. ANDI T1,A0,07E0
  174. ADDIU T2,A0,0001
  175. SLL T0,T0,0x1
  176. LHU T3,0800 (T0)
  177. ANDI T2,T2,001F
  178. OR A0,T1,T2
  179. ANDI T0,T3,8080
  180. SRL T1,T0,0xE
  181. SRL T0,T0,0x5
  182. OR T0,T0,T1
  183. SB T0,0E81 (T4)
  184. ANDI T0,T3,4040
  185. SRL T1,T0,0xD
  186. SRL T0,T0,0x4
  187. OR T0,T0,T1
  188. SB T0,0E82 (T4)
  189. ANDI T0,T3,2020
  190. SRL T1,T0,0xC
  191. SRL T0,T0,0x3
  192. OR T0,T0,T1
  193. SB T0,0E83 (T4)
  194. ANDI T0,T3,1010
  195. SRL T1,T0,0xB
  196. SRL T0,T0,0x2
  197. OR T0,T0,T1
  198. SB T0,0E84 (T4)
  199. ANDI T0,T3,0808
  200. SRL T1,T0,0xA
  201. SRL T0,T0,0x1
  202. OR T0,T0,T1
  203. SB T0,0E85 (T4)
  204. ANDI T0,T3,0404
  205. SRL T1,T0,0x9
  206. OR T0,T0,T1
  207. SB T0,0E86 (T4)
  208. ANDI T0,T3,0202
  209. SRL T1,T0,0x8
  210. SLL T0,T0,0x1
  211. OR T0,T0,T1
  212. SB T0,0E87 (T4)
  213. ANDI T1,T3,0101
  214. SRL T2,T1,0x7
  215. SLL T1,T1,0x2
  216. OR T1,T1,T2
  217. SB T1,0E88 (T4)
  218. ADDIU A2,A2,FFF8
  219. BGTZ A2,A40012A8
  220. ADDIU T4,T4,0008
  221. ORI A0,R0,0E88 ;RSP= A4000E88
  222. OR A1,K0,R0 ;RDRAM= K0
  223. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  224. ORI A2,R0,009F ;0xA0 bytes
  225. ADDIU K0,K0,FF60
  226. ADDIU S4,S4,FFF8
  227. BGTZ S5,A4001248
  228. ADDIU S5,S5,FFFF
  229. BEQ S6,R0,A40013AC
  230. NOP
  231. ORI A0,R0,0800 ;RSP= A4000800
  232. ADDIU A1,T8,1000 ;RDRAM= T8 + 0x1000
  233. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  234. ORI A2,R0,00FF ;0x100 bytes
  235. J A4001238
  236. XORI S6,S6,0010
  237. ADDIU T8,T8,FE00
  238. BGTZ S7,A4001224
  239. ADDIU S7,S7,FFFF
  240. LW A1,0FF8 (R0) ;RDRAM= @A4000FF8
  241. ORI A0,R0,0000 ;RSP= A4000000
  242. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  243. ORI A2,R0,009F ;0xA0 bytes
  244. ADDIU S4,R0,009C
  245. SW R0,0810 (R0)
  246. SW R0,0814 (R0)
  247. SW R0,0818 (R0)
  248. SW R0,081C (R0)
  249. LBU K0,0000 (S4)
  250. BEQ K0,R0,A400186C
  251. SLTIU T0,K0,00A0
  252. BEQ T0,R0,A400186C
  253. LBU A3,0001 (S4)
  254. BEQ A3,R0,A400186C
  255. SLTIU T0,A3,00A8
  256. BEQ T0,R0,A400186C
  257. LBU S6,0002 (S4)
  258. ORI A0,R0,0820 ;RSP= A4000820
  259. ORI A2,R0,001F ;0x20 bytes
  260. ANDI T0,S6,00FE
  261. SLL T0,T0,0x4
  262. ADDU T0,T0,GP
  263. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  264. ADDIU A1,T0,8200 ;RDRAM= GP + 0x8200 + T0*0x10
  265. LBU T4,0003 (S4)
  266. ANDI T0,S6,0001
  267. SLL S7,T0,0x4
  268. ANDI T0,T4,0080
  269. BNE T0,R0,A4001438
  270. ORI V0,R0,007F
  271. ANDI V0,R0,0000
  272. ANDI T0,T4,0010
  273. SRL T0,T0,0x4
  274. ORI S6,R0,0010
  275. SRLV S6,S6,T0
  276. ANDI T0,T4,0040
  277. BEQ T0,R0,A4001514
  278. LHU T0,082E (S7)
  279. LHU T1,082C (S7)
  280. LHU T2,082A (S7)
  281. LHU T3,0828 (S7)
  282. SH T0,0800 (R0)
  283. SH T1,0802 (R0)
  284. SH T2,0804 (R0)
  285. SH T3,0806 (R0)
  286. LHU T0,0826 (S7)
  287. LHU T1,0824 (S7)
  288. LHU T2,0822 (S7)
  289. LHU T3,0820 (S7)
  290. SH T0,0808 (R0)
  291. SH T1,080A (R0)
  292. SH T2,080C (R0)
  293. SH T3,080E (R0)
  294. LHU T0,083E (R0)
  295. LHU T1,083C (R0)
  296. LHU T2,0820 (R0)
  297. LHU T3,0822 (R0)
  298. SH T0,0820 (R0)
  299. SH T1,0822 (R0)
  300. SH T2,083E (R0)
  301. SH T3,083C (R0)
  302. LHU T0,083A (R0)
  303. LHU T1,0838 (R0)
  304. LHU T2,0824 (R0)
  305. LHU T3,0826 (R0)
  306. SH T0,0824 (R0)
  307. SH T1,0826 (R0)
  308. SH T2,083A (R0)
  309. SH T3,0838 (R0)
  310. LHU T0,0836 (R0)
  311. LHU T1,0834 (R0)
  312. LHU T2,0828 (R0)
  313. LHU T3,082A (R0)
  314. SH T0,0828 (R0)
  315. SH T1,082A (R0)
  316. SH T2,0836 (R0)
  317. SH T3,0834 (R0)
  318. LHU T0,0832 (R0)
  319. LHU T1,0830 (R0)
  320. LHU T2,082C (R0)
  321. LHU T3,082E (R0)
  322. SH T0,082C (R0)
  323. SH T1,082E (R0)
  324. SH T2,0832 (R0)
  325. J A4001550
  326. SH T3,0830 (R0)
  327. LHU T1,082C (S7)
  328. LHU T2,082A (S7)
  329. LHU T3,0828 (S7)
  330. SH T0,080E (R0)
  331. SH T1,080C (R0)
  332. SH T2,080A (R0)
  333. SH T3,0808 (R0)
  334. LHU T0,0826 (S7)
  335. LHU T1,0824 (S7)
  336. LHU T2,0822 (S7)
  337. LHU T3,0820 (S7)
  338. SH T0,0806 (R0)
  339. SH T1,0804 (R0)
  340. SH T2,0802 (R0)
  341. SH T3,0800 (R0)
  342. SLTIU T0,K0,0010
  343. ANDI T8,R0,0000
  344. ORI S7,R0,0010
  345. SUBU S7,S7,K0
  346. SLL S7,S7,0x1
  347. BNE T0,R0,A4001588
  348. OR S5,K0,R0
  349. ADDIU T8,K0,FFF0
  350. ANDI S7,R0,0000
  351. SLTIU T0,K0,0091
  352. BNE T0,R0,A4001588
  353. ORI S5,R0,0010
  354. ORI S5,R0,00A0
  355. SUBU S5,S5,K0
  356. SLL T1,T8,0x2
  357. ADDU T1,T1,T8
  358. SLL T1,T1,0x5
  359. ADDIU T1,T1,7B80
  360. ADDU A1,T1,GP
  361. SLL T0,T8,0x3
  362. LBU T0,0A00 (T0)
  363. ANDI T1,T0,0082
  364. XORI T1,T1,0082
  365. BNE T1,R0,A4001858
  366. ANDI T1,T0,0004
  367. SLL T1,T1,0x3
  368. ADDU T1,T1,S7
  369. LHU T3,0800 (T1)
  370. BEQ T3,R0,A4001858
  371. ORI A0,R0,0E88 ;RSP= A4000E88
  372. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  373. ORI A2,R0,009F ;0xA0 bytes
  374. ANDI T1,T4,0020
  375. BEQ T1,R0,A4001718
  376. ANDI T0,T3,8080
  377. BEQ T0,R0,A4001604
  378. ANDI T1,T3,4040
  379. LBU T9,0E87 (A3)
  380. SRL T2,T0,0xE
  381. SRL T0,T0,0x5
  382. AND T9,T9,V0
  383. BNE T9,R0,A4001604
  384. OR T2,T2,T0
  385. OR T2,T2,S6
  386. SB T2,0E87 (A3)
  387. BEQ T1,R0,A400162C
  388. ANDI T0,T3,2020
  389. LBU T9,0E86 (A3)
  390. SRL T2,T1,0xD
  391. SRL T1,T1,0x4
  392. AND T9,T9,V0
  393. BNE T9,R0,A400162C
  394. OR T2,T2,T1
  395. OR T2,T2,S6
  396. SB T2,0E86 (A3)
  397. BEQ T0,R0,A4001654
  398. ANDI T1,T3,1010
  399. LBU T9,0E85 (A3)
  400. SRL T2,T0,0xC
  401. SRL T0,T0,0x3
  402. AND T9,T9,V0
  403. BNE T9,R0,A4001654
  404. OR T2,T2,T0
  405. OR T2,T2,S6
  406. SB T2,0E85 (A3)
  407. BEQ T1,R0,A400167C
  408. ANDI T0,T3,0808
  409. LBU T9,0E84 (A3)
  410. SRL T2,T1,0xB
  411. SRL T1,T1,0x2
  412. AND T9,T9,V0
  413. BNE T9,R0,A400167C
  414. OR T2,T2,T1
  415. OR T2,T2,S6
  416. SB T2,0E84 (A3)
  417. BEQ T0,R0,A40016A4
  418. ANDI T1,T3,0404
  419. LBU T9,0E83 (A3)
  420. SRL T2,T0,0xA
  421. SRL T0,T0,0x1
  422. AND T9,T9,V0
  423. BNE T9,R0,A40016A4
  424. OR T2,T2,T0
  425. OR T2,T2,S6
  426. SB T2,0E83 (A3)
  427. BEQ T1,R0,A40016C8
  428. ANDI T0,T3,0202
  429. LBU T9,0E82 (A3)
  430. SRL T2,T1,0x9
  431. OR T2,T2,T1
  432. AND T9,T9,V0
  433. BNE T9,R0,A40016C8
  434. OR T2,T2,S6
  435. SB T2,0E82 (A3)
  436. BEQ T0,R0,A40016F0
  437. ANDI T1,T3,0101
  438. LBU T9,0E81 (A3)
  439. SRL T2,T0,0x8
  440. SLL T0,T0,0x1
  441. AND T9,T9,V0
  442. BNE T9,R0,A40016C8
  443. OR T2,T2,T0
  444. OR T2,T2,S6
  445. SB T2,0E81 (A3)
  446. BEQ T1,R0,A4001850
  447. LBU T9,0E80 (A3)
  448. SRL T2,T1,0x7
  449. SLL T1,T1,0x2
  450. AND T9,T9,V0
  451. BNE T9,R0,A40016F0
  452. OR T2,T2,T1
  453. OR T2,T2,S6
  454. J A4001850
  455. SB T2,0E80 (A3)
  456. BEQ T0,R0,A4001740
  457. ANDI T1,T3,4040
  458. LBU T9,0E80 (A3)
  459. SRL T2,T0,0xE
  460. SRL T0,T0,0x5
  461. AND T9,T9,V0
  462. BNE T9,R0,A4001740
  463. OR T2,T2,T0
  464. OR T2,T2,S6
  465. SB T2,0E80 (A3)
  466. BEQ T1,R0,A4001768
  467. ANDI T0,T3,2020
  468. LBU T9,0E81 (A3)
  469. SRL T2,T1,0xD
  470. SRL T1,T1,0x4
  471. AND T9,T9,V0
  472. BNE T9,R0,A4001768
  473. OR T2,T2,T1
  474. OR T2,T2,S6
  475. SB T2,0E81 (A3)
  476. BEQ T0,R0,A4001790
  477. ANDI T1,T3,1010
  478. LBU T9,0E82 (A3)
  479. SRL T2,T0,0xC
  480. SRL T0,T0,0x3
  481. AND T9,T9,V0
  482. BNE T9,R0,A4001790
  483. OR T2,T2,T0
  484. OR T2,T2,S6
  485. SB T2,0E82 (A3)
  486. BEQ T1,R0,A40017B8
  487. ANDI T0,T3,0808
  488. LBU T9,0E83 (A3)
  489. SRL T2,T1,0xB
  490. SRL T1,T1,0x2
  491. AND T9,T9,V0
  492. BNE T9,R0,A40017B8
  493. OR T2,T2,T1
  494. OR T2,T2,S6
  495. SB T2,0E83 (A3)
  496. BEQ T0,R0,A40017E0
  497. ANDI T1,T3,0404
  498. LBU T9,0E84 (A3)
  499. SRL T2,T0,0xA
  500. SRL T0,T0,0x1
  501. AND T9,T9,V0
  502. BNE T9,R0,A40017E0
  503. OR T2,T2,T0
  504. OR T2,T2,S6
  505. SB T2,0E84 (A3)
  506. BEQ T1,R0,A4001804
  507. ANDI T0,T3,0202
  508. LBU T9,0E85 (A3)
  509. SRL T2,T1,0x9
  510. OR T2,T2,T1
  511. AND T9,T9,V0
  512. BNE T9,R0,A4001804
  513. OR T2,T2,S6
  514. SB T2,0E85 (A3)
  515. BEQ T0,R0,A400182C
  516. ANDI T1,T3,0101
  517. LBU T9,0E86 (A3)
  518. SRL T2,T0,0x8
  519. SLL T0,T0,0x1
  520. AND T9,T9,V0
  521. BNE T9,R0,A400182C
  522. OR T2,T2,T0
  523. OR T2,T2,S6
  524. SB T2,0E86 (A3)
  525. BEQ T1,R0,A4001850
  526. LBU T9,0E87 (A3)
  527. SRL T2,T1,0x7
  528. SLL T1,T1,0x2
  529. AND T9,T9,V0
  530. BNE T9,R0,A400182C
  531. OR T2,T2,T1
  532. OR T2,T2,S6
  533. SB T2,0E87 (A3)
  534. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  535. NOP
  536. ADDIU A1,A1,00A0
  537. ADDIU S7,S7,0002
  538. ADDIU S5,S5,FFFF
  539. BGTZ S5,A400159C
  540. ADDIU T8,T8,0001
  541. BGTZ S4,A40013CC
  542. ADDIU S4,S4,FFFC
  543. LBU T0,0FDF (R0)
  544. ANDI T1,T0,00C0
  545. BEQ T1,R0,A40018B4
  546. ANDI T1,T0,003F
  547. SRL T1,T1,0x1
  548. SUBU T0,R0,T1
  549. ORI T1,R0,0000
  550. ORI T2,R0,001F
  551. @A4001894
  552. BGEZ T0,A40018A0
  553. OR T3,T0,R0
  554. ANDI T3,R0,0000
  555. @A40018A0: build color conversion table
  556. SB T3,0FA0 (T1)
  557. ADDIU T0,T0,0001
  558. ADDIU T1,T1,0001
  559. BGTZ T2,A4001894
  560. ADDIU T2,T2,FFFF
  561. @A40018B4: load 10x10 c16 image at A4000700
  562. ORI A0,R0,0700 ;RSP= A4000700
  563. ADDIU A1,GP,4A00 ;RDRAM= GP + 0x4A00
  564. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  565. ORI A2,R0,01FF ;0x200 bytes
  566. LBU T2,0FDF (R0)
  567. ANDI T2,T2,0040
  568. BEQ T2,R0,A40018DC ;if @A4000FDF & 0x40, convert color samples
  569. @A40018D0: convert color samples from loaded image
  570. ORI A0,R0,0700 ;A0= A4000700
  571. JAL A4001DA4 ;translate A2 16bit pixels at A0 with color table A4000FA0
  572. ORI A2,R0,0100 ;0x100 pixels (0x200)
  573. @A40018DC
  574. ORI T1,R0,027E
  575. @A40018E0: initialize A4000400 to A4000680
  576. SH R0,0400 (T1)
  577. BGTZ T1,A40018E0 ;initialize 0x280 bytes at A4000400
  578. ADDIU T1,T1,FFFE
  579. @A40018EC
  580. LBU T1,0FDE (R0)
  581. LBU T0,0FDD (R0)
  582. LBU S7,0FDC (R0)
  583. LW K1,0FE8 (R0)
  584. SLL S7,S7,0x1
  585. BEQ T1,R0,A4001A00
  586. ANDI T8,R0,0000
  587. LW T8,0FE0 (R0)
  588. ORI T1,R0,EF00
  589. ADDU T8,T8,T1
  590. SLTIU T2,T0,0060
  591. BEQ T2,R0,A4001A00
  592. ADDIU T2,T0,008F
  593. LUI T1,0002
  594. ORI T1,T1,5580
  595. ADDU T9,K1,T1
  596. LBU V0,0FD4 (R0)
  597. BEQ V0,R0,A4001958
  598. LBU T1,0FD5 (R0)
  599. LW A3,0FD0 (R0)
  600. ADDIU T3,V0,FFFF
  601. ADDIU T0,V0,FF0F
  602. ADDU V0,T0,T1
  603. SLL T0,T3,0x2
  604. ADDU T0,T0,T3
  605. SLL T0,T0,0x7
  606. ADDU A3,A3,T0
  607. @A4001958
  608. ADDIU S5,T2,FF12
  609. ORI A0,R0,0900 ;RSP= A4000900
  610. OR A1,T8,R0 ;RDRAM= T8
  611. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  612. ORI A2,R0,00FF ;0x100 bytes
  613. JAL A4001D64
  614. ORI A2,R0,027F
  615. BEQ V0,R0,A40019E0
  616. NOP
  617. BLTZ V0,A4001998
  618. NOP
  619. ADDIU V0,V0,FFFF
  620. BNE V0,R0,A40019A8
  621. NOP
  622. J A40019E0
  623. NOP
  624. @A4001998
  625. ADDIU V0,V0,0001
  626. BNE V0,R0,A40019E0
  627. NOP
  628. LBU V0,0FD4 (R0)
  629. @A40019A8
  630. ORI A0,R0,0180 ;RSP= A4000180
  631. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  632. OR A1,A3,R0 ;RDRAM= A1
  633. ADDIU A3,A3,FD80
  634. ORI A0,R0,027C
  635. @A40019BC
  636. LHU T0,0180 (A0)
  637. LHU T1,0182 (A0)
  638. BEQ T0,R0,A40019D0
  639. NOP
  640. SH T0,0400 (A0)
  641. @A40019D0
  642. BEQ T1,R0,A40019DC
  643. ADDIU A0,A0,FFFC
  644. SH T1,0406 (A0)
  645. @A40019DC
  646. BGTZ A0,A40019BC
  647. @A40019E0
  648. OR A1,T9,R0 ;RDRAM= T9
  649. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  650. ORI A0,R0,0400 ;RSP= A4000400
  651. ADDIU T8,T8,FF00
  652. ADDIU S5,S5,0001
  653. BLEZ S5,A400195C
  654. ADDIU T9,T9,FD80
  655. LBU T0,0FDD (R0)
  656. @A4001A00
  657. ADDIU T0,T0,008F
  658. SLL T1,T0,0x2
  659. ADDU T1,T1,T0
  660. SLL T1,T1,0x7
  661. ADDU T9,K1,T1
  662. ORI A0,R0,0000 ;RSP= A4000000
  663. ADDIU A1,GP,2F20 ;RDRAM= GP + 0x2F20
  664. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  665. ORI A2,R0,0167 ;0x168 bytes
  666. ORI A0,R0,0F80 ;RSP= A4000F80
  667. ADDIU A1,GP,2F00 ;RDRAM= GP + 0x2F00
  668. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  669. ORI A2,R0,001F ;0x20 bytes
  670. LBU T1,0FDF (R0)
  671. ANDI T1,T1,0080
  672. BEQ T1,R0,A4001A4C
  673. ORI A0,R0,0F80 ;A0= A4000F80
  674. JAL A4001DA4 ;translate A2 16bit pixels at A0 with color table A4000FA0
  675. ORI A2,R0,0010 ;0x10 pixels (0x20)
  676. @A4001A4C
  677. ORI S5,R0,008F
  678. ORI T0,R0,D4E0
  679. ADDU K0,GP,T0
  680. SLL S4,S5,0x3
  681. ORI V0,R0,0153
  682. ORI A0,R0,0E80 ;RSP= A4000E80
  683. OR A1,K0,R0 ;RDRAM= K0
  684. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  685. ORI A2,R0,009F ;0xA0 bytes
  686. BEQ T8,R0,A4001ABC
  687. ORI A0,R0,0900 ;RSP= A4000900
  688. OR A1,T8,R0 ;RDRAM= T8
  689. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  690. ORI A2,R0,00FF ;0x100 bytes
  691. ORI T0,R0,0030
  692. SLL T1,T0,0x1
  693. ADDU T1,T1,S7
  694. @A4001A90
  695. LBU T2,08FF (T0)
  696. LBU T3,09CF (T0)
  697. ADDIU T0,T0,FFFF
  698. SLL T2,T2,0x1
  699. SLL T3,T3,0x1
  700. LHU T2,0700 (T2)
  701. LHU T3,0700 (T3)
  702. ADDIU T1,T1,FFFE
  703. SH T2,0400 (T1)
  704. BGTZ T0,A4001A90
  705. SH T3,05A0 (T1)
  706. @A4001ABC
  707. LB T2,0A00 (S4)
  708. LBU T0,0A03 (S4)
  709. LHU T1,0A04 (S4)
  710. ORI A1,R0,0098
  711. ADDIU A2,S7,0190
  712. BLTZ T2,A4001B14
  713. SLL T0,T0,0x1
  714. ANDI T3,T0,0006
  715. LHU T3,0F80 (T3)
  716. SH T3,040E (A2)
  717. SH T3,040C (A2)
  718. SH T3,040A (A2)
  719. SH T3,0408 (A2)
  720. SH T3,0406 (A2)
  721. SH T3,0404 (A2)
  722. SH T3,0402 (A2)
  723. ADDIU A2,A2,FFF0
  724. ADDIU A1,A1,FFF8
  725. BGEZ A1,A4001AE0
  726. SH T3,0410 (A2)
  727. J A4001BF4
  728. NOP
  729. @A4001B14
  730. SLL T1,T1,0x9
  731. OR S6,T0,T1
  732. ADDIU V0,V0,0014
  733. @A4001B20
  734. LBU A3,0E87 (A1)
  735. LBU T4,0000 (V0)
  736. ADDIU V0,V0,FFFF
  737. SRLV A3,S6,A3
  738. ANDI A3,A3,0006
  739. LBU T3,0E86 (A1)
  740. OR A3,A3,T4
  741. LHU A3,0F80 (A3)
  742. SRLV T3,S6,T3
  743. ANDI T3,T3,0006
  744. SH A3,040E (A2)
  745. LBU A3,0E85 (A1)
  746. OR T3,T3,T4
  747. LHU T3,0F80 (T3)
  748. SRLV A3,S6,A3
  749. ANDI A3,A3,0006
  750. SH T3,040C (A2)
  751. LBU T3,0E84 (A1)
  752. OR A3,A3,T4
  753. LHU A3,0F80 (A3)
  754. SRLV T3,S6,T3
  755. ANDI T3,T3,0006
  756. SH A3,040A (A2)
  757. LBU A3,0E83 (A1)
  758. OR T3,T3,T4
  759. LHU T3,0F80 (T3)
  760. SRLV A3,S6,A3
  761. ANDI A3,A3,0006
  762. SH T3,0408 (A2)
  763. LBU T3,0E82 (A1)
  764. OR A3,A3,T4
  765. LHU A3,0F80 (A3)
  766. SRLV T3,S6,T3
  767. ANDI T3,T3,0006
  768. SH A3,0406 (A2)
  769. LBU A3,0E81 (A1)
  770. OR T3,T3,T4
  771. LHU T3,0F80 (T3)
  772. SRLV A3,S6,A3
  773. ANDI A3,A3,0006
  774. SH T3,0404 (A2)
  775. LBU T3,0E80 (A1)
  776. OR A3,A3,T4
  777. LHU A3,0F80 (A3)
  778. SRLV T3,S6,T3
  779. ANDI T3,T3,0006
  780. SH A3,0402 (A2)
  781. OR T3,T3,T4
  782. LHU T3,0F80 (T3)
  783. ADDIU A2,A2,FFF0
  784. ADDIU A1,A1,FFF8
  785. BGEZ A1,A4001B20
  786. SH T3,0410 (A2)
  787. @A4001BF4
  788. ADDIU A0,S7,0460
  789. ADDIU A1,T9,0060
  790. ADDU A1,A1,S7
  791. BEQ T8,R0,A4001C14
  792. ORI A2,R0,013F
  793. @A4001C08
  794. ADDIU A0,R0,0400 ;RSP= A4000400
  795. ORI A2,R0,027F ;0x280 bytes
  796. OR A1,T9,R0 ;RDRAM= T9
  797. @A4001C14
  798. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  799. NOP
  800. BEQ T8,R0,A4001C28
  801. ADDIU T9,T9,FD80
  802. ADDIU T8,T8,FF00
  803. @A4001C28
  804. ADDIU K0,K0,FF60
  805. ANDI T0,S5,0007
  806. BNE T0,R0,A4001A60
  807. ADDIU S5,S5,FFFF
  808. BGEZ S5,A4001A60
  809. ADDIU V0,V0,FFEC
  810. BEQ T8,R0,A4001C94
  811. LBU T0,0FDD (R0)
  812. BEQ T0,R0,A4001C94
  813. ADDIU S5,T0,FFFF
  814. ORI T0,R0,027C
  815. SW R0,0400 (T0)
  816. BGTZ T0,A4001C54
  817. ADDIU T0,T0,FFFC
  818. @A4001C60
  819. ORI A0,R0,0900 ;RSP= A4000900
  820. OR A1,T8,R0 ;RDRAM= T8
  821. JAL A4001D1C ;read A2 bytes between RSP A0 and rdram A1
  822. ORI A2,R0,00FF ;0x100 bytes
  823. JAL A4001D64
  824. ORI A0,R0,0400
  825. OR A1,T9,R0 ;RDRAM= T9
  826. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  827. ORI A2,R0,027F ;0x280 bytes
  828. ADDIU T8,T8,FF00
  829. ADDIU S5,S5,FFFF
  830. BGEZ S5,A4001C60
  831. ADDIU T9,T9,FD80
  832. @A4001C94
  833. NOP
  834. ORI T0,R0,027C
  835. @A4001C9C
  836. SW R0,0400 (T0)
  837. BGTZ T0,A4001C9C
  838. ADDIU T0,T0,FFFC
  839. @A4001CA8
  840. ORI S5,R0,0007
  841. ORI A0,R0,0400 ;RSP= A4000400
  842. OR A1,K1,R0 ;RDRAM= K1
  843. @A4001CB4
  844. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  845. ORI A2,R0,027F ;0x280 bytes
  846. ADDIU A1,A1,0280
  847. BGTZ S5,A4001CB4
  848. ADDIU S5,S5,FFFF
  849. @A4001CC8
  850. ORI S5,R0,0007
  851. LUI T0,0002
  852. ORI T0,T0,4400
  853. ADDU A1,K1,T0 ;RDRAM= K1 + 0x24400
  854. @A4001CD8
  855. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  856. ORI A2,R0,027F ;0x280 bytes
  857. ADDIU A1,A1,0280
  858. BGTZ S5,A4001CD8
  859. ADDIU S5,S5,FFFF
  860. @A4001CEC
  861. ORI AT,R0,4000
  862. MTC0 AT,SP-Status ;SP Status: set signal 2
  863. BREAK 00000000
  864. NOP
  865. @A4001CFC
  866. LUI A1,0061 ;RDRAM= 0x610000
  867. ORI A0,R0,0000 ;RSP= A4000000
  868. JAL A4001D14 ;write A2 bytes between RSP A0 and rdram A1
  869. ORI A2,R0,0FFF ;0x1000 bytes
  870. J A4001CEC
  871. NOP
  872.  
  873. A4001D14 write A2 bytes between RSP A0 and rdram A1
  874. J A4001D20 ;read or write (A0 & 0x8000) A2 bytes between RSP A0 and rdram A1
  875. ORI A0,A0,8000 ;A0|=0x8000 write
  876.  
  877. A4001D1C read A2 bytes between RSP A0 and rdram A1
  878. ANDI A0,A0,7FFF
  879.  
  880. A4001D20 read or write (A0 & 0x8000) A2 bytes between RSP A0 and rdram A1
  881. accepts: A0=mode|address, A1=p->rdram, A2=length
  882. MFC0 AT,SP-Semaphore
  883. BNE AT,R0,A4001D20 ;loop while semaphore flag set
  884. @ A4001D28
  885. MFC0 AT,SP-DMA Full
  886. BNE AT,R0,A4001D28 ;loop until DMA can take more input
  887. @ A4001D30
  888. ANDI AT,A0,8000
  889. ANDI A0,A0,7FFF
  890. MTC0 A0,SP-Memory Address
  891. BNE AT,R0,A4001D4C ;if 0x8000 set, write
  892. MTC0 A1,SP-DRAM Address
  893. J A4001D50
  894. MTC0 A2,SP-Read Length
  895. @ A4001D4C
  896. MTC0 A2,SP-Write Length
  897. @ A4001D50
  898. MFC0 AT,SP-DMA Busy
  899. BNE AT,R0,A4001D50 ;loop until data written
  900. NOP
  901. JR RA
  902. MTC0 R0,SP-Semaphore ;reset semaphore flag
  903.  
  904. A4001D64
  905. ORI T0,R0,0100
  906. SLL T1,T0,0x1
  907. ADDU T1,T1,S7
  908. @ A4001D70
  909. LBU T2,08FF (T0)
  910. LBU T3,08FE (T0)
  911. ADDIU T0,T0,FFFE
  912. SLL T2,T2,0x1
  913. SLL T3,T3,0x1
  914. LHU T2,0700 (T2)
  915. LHU T3,0700 (T3)
  916. ADDIU T1,T1,FFFC
  917. SH T2,0402 (T1)
  918. BGTZ T0,A4001D70
  919. SH T3,0400 (T1)
  920. @ A4001D9C
  921. JR RA
  922. NOP
  923.  
  924. A4001DA4 translate A2 16bit pixels at A0 with color table A4000FA0
  925. accepts: A0=RSP address, A1=(unused), A2=#pixels
  926. LHU T0,0000 (A0) ;T0= @A0: 16bit pixel
  927. ADDIU A2,A2,FFFF ;count-=1
  928. ADDIU A0,A0,0002
  929. SRL T1,T0,0xB ;T1= T0 / 0x800: range(0:0x1F) F800: red
  930. LBU T1,0FA0 (T1) ;T1= A4000FA0[T1]: color correction for red
  931. SRL T2,T0,0x6
  932. ANDI T2,T2,001F ;T2= T0 / 0x40: range(0:0x1F) 07C0: green
  933. LBU T2,0FA0 (T2) ;T2= A4000FA0[T2]: color correction for green
  934. SRL T3,T0,0x1
  935. ANDI T3,T3,001F ;T3= T0 / 2: range(0:0x1F) 003E: blue
  936. LBU T3,0FA0 (T3) ;T3= A4000FA0[T3]: color correction for blue
  937. SLL T1,T1,0xB
  938. SLL T2,T2,0x6
  939. SLL T3,T3,0x1
  940. OR T1,T1,T2
  941. OR T1,T1,T3 ;T1= red | green | blue (no alpha set)
  942. BGTZ A2,A4001DA4
  943. SH T1,FFFE (A0) ;update pixel
  944. @ A4001DEC: return
  945. JR RA
  946. NOP
  947.  
  948.  
  949. A4000000 0x800 ???; GP+0x9A00
  950. A4000800 0x200 GB image data; GP+0x1200, GB pixels
  951. A4000A00 0x480 ???; @A4000FF0 + 0x80, 8 ea.
  952. A4000E80 0xA0 line of converted GB image data
  953. A4000F20
  954. A4000
  955. A4000FA0 0x20 color translation samples
  956. A4000FC0
  957. A4000
  958. A4000FD8 4 p->???; set as GP
  959. A4000FF0 4 p->???; RDRAM source
  960.  
  961. 8111F470 A4001000 RSP microcode: GB 32bit video emulation
  962. LW GP,0FD8 (R0) ;GP= @A4000FD8
  963. ORI A0,R0,0A00 ;RSP= A4000A00
  964. LW A1,0FF0 (R0)
  965. ORI A2,R0,047F ;0x480 bytes
  966. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  967. ADDIU A1,A1,0080 ;RDRAM= @A4000FF0 + 0x80
  968. ORI T0,R0,009C
  969. @A400101C: initialize 0xA0 bytes at A4000E80 (initialize line)
  970. SW R0,0E80 (T0) ;A4000E80[0:0x9C]= 0
  971. BGTZ T0,A400101C
  972. ADDIU T0,T0,FFFC
  973. @A4001028
  974. ORI T0,R0,008F
  975. ADDIU A1,GP,7B80 ;RDRAM= GP + 0x7B80
  976. ORI A0,R0,0E80 ;RSP= A4000E80
  977. @A4001034: intialize visible area: initialize 0xA0 x 0x90 bytes from GP+0x7B80 to GP+0xD580
  978. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  979. ORI A2,R0,009F ;0xA0 bytes
  980. ADDIU A1,A1,00A0
  981. BGTZ T0,A4001034 ;copy 0x90 times
  982. ADDIU T0,T0,FFFF
  983. @A4001048
  984. ADDIU A1,GP,9A00 ;RDRAM= GP + 0x9A00
  985. ORI A0,R0,0000 ;RSP= A4000000
  986. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  987. ORI A2,R0,07FF ;0x800 bytes
  988. ADDIU T8,GP,1200
  989. ORI S7,R0,0007
  990. ORI S6,R0,0010 ;S6= 0x10
  991. ORI A0,R0,0800 ;RSP= A4000800
  992. OR A1,T8,R0 ;RDRAM= GP + 0x1200
  993. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  994. ORI A2,R0,01FF ;0x200 bytes
  995. ORI S5,R0,008F ;S5= 0x8F: #lines
  996. ORI T0,R0,D4E0
  997. ADDU K0,GP,T0 ;K0= GP + 0xD4E0: line 0x8F (last line)
  998. SLL S4,S5,0x3 ;S4= #lines * 8
  999. @A4001084
  1000. LBU V0,0A00 (S4) ;V0= A4000A00[S5]
  1001. LBU T3,0A01 (S4) ;T3= A4000A01[S5]
  1002. OR T0,S6,S7
  1003. ANDI T1,V0,0010 ;T1= 0x10 flag in V0
  1004. XOR T0,T0,T1
  1005. ANDI T1,T3,0007 ;T1= 0x7 flags in T3
  1006. XOR T0,T0,T1 ;T0= S6 | S7 ^ V0&0x10 ^ T3&7
  1007. BNE T0,R0,A40011E0 ;if any flags set, skip to previous line
  1008. ANDI T0,V0,0081
  1009. XORI T0,T0,0081 ;T0 ^= V0 & 0x81
  1010. BNE T0,R0,A40011E0 ;if either flag set, skip to previous line
  1011. @A40010B0
  1012. LBU A3,0A02 (S4) ;A3= A4000A02[S5]
  1013. ANDI T1,V0,0008
  1014. SLL T1,T1,0x7 ;T1= (V0 & 8) * 0x80
  1015. SRL T2,T3,0x3
  1016. SLL T2,T2,0x5 ;T2= (T3 / 8) * 0x20: (T3 & 0x3FF8)<<2
  1017. ADDU T1,T1,T2 ;T1 += T2
  1018. SRL T2,A3,0x3 ;T2= A4000A02[S5] / 8: index
  1019. OR A0,T1,T2 ;A0= T1 | index
  1020. LBU T0,0000 (A0) ;T0= A4000000 + A0
  1021. ADDIU T2,T2,0001
  1022. ANDI T2,T2,001F ;index += 1, rolled around 0x20
  1023. SLL T0,T0,0x1
  1024. LHU T3,0800 (T0) ;T3= A4000800[T0]: set of 8 GB pixels
  1025. OR A0,T1,T2 ;A0= T1 | index
  1026. ANDI T1,V0,00A0
  1027. XORI T1,T1,00A0
  1028. BNE T1,R0,A4001100 ;T0= @A4000A07[S5]-7 if 0xA0 flags set in V0 else 0xA0
  1029. ORI T0,R0,00A0 ;T0= 0xA0
  1030. LBU T0,0A07 (S4)
  1031. ADDIU T0,T0,FFF9 ;T0= @A4000A07[S5] - 7
  1032. @A4001100
  1033. ANDI T1,A3,0007
  1034. ADDU A2,T0,T1 ;A2= T0 + (A3 & 7): # pixels
  1035. XORI A1,T1,0007 ;A1= not(A3 & 7)
  1036. @A400110C: convert GB image type to array of 8 bytes
  1037. ANDI T0,T3,8080
  1038. SRL T1,T0,0xE
  1039. SRL T0,T0,0x5
  1040. OR T0,T0,T1
  1041. SB T0,0E81 (A1) ;A4000E81[A1] = GB[0]>>6 | GB[1]>>5: palette entry 0-3
  1042. ANDI T0,T3,4040
  1043. SRL T1,T0,0xD
  1044. SRL T0,T0,0x4
  1045. OR T0,T0,T1
  1046. SB T0,0E82 (A1) ;A4000E82[A1] = GB[0]>>5 | GB[1]>>4: palette entry 0-3
  1047. ANDI T0,T3,2020
  1048. SRL T1,T0,0xC
  1049. SRL T0,T0,0x3
  1050. OR T0,T0,T1
  1051. SB T0,0E83 (A1) ;A4000E83[A1] = GB[0]>>4 | GB[1]>>3: palette entry 0-3
  1052. ANDI T0,T3,1010
  1053. SRL T1,T0,0xB
  1054. SRL T0,T0,0x2
  1055. OR T0,T0,T1
  1056. SB T0,0E84 (A1) ;A4000E84[A1] = GB[0]>>3 | GB[1]>>2: palette entry 0-3
  1057. ANDI T0,T3,0808
  1058. SRL T1,T0,0xA
  1059. SRL T0,T0,0x1
  1060. OR T0,T0,T1
  1061. SB T0,0E85 (A1) ;A4000E85[A1] = GB[0]>>2 | GB[1]>>1: palette entry 0-3
  1062. ANDI T0,T3,0404
  1063. SRL T1,T0,0x9
  1064. OR T0,T0,T1
  1065. SB T0,0E86 (A1) ;A4000E86[A1] = GB[0]>>1 | GB[1]>>0: palette entry 0-3
  1066. ANDI T0,T3,0202
  1067. SRL T1,T0,0x8
  1068. SLL T0,T0,0x1
  1069. OR T0,T0,T1
  1070. SB T0,0E87 (A1) ;A4000E87[A1] = GB[0]>>0 | GB[1]<<1: palette entry 0-3
  1071. LBU T0,0000 (A0) ;A0= T1 | index
  1072. ANDI T1,T3,0101
  1073. SRL T2,T1,0x7
  1074. SLL T1,T1,0x2
  1075. OR T1,T1,T2
  1076. SB T1,0E88 (A1) ;A4000E88[A1] = GB[0]<<1 | GB[1]<<2: palette entry 0-3
  1077. ADDIU T2,A0,0001
  1078. ANDI T2,T2,001F
  1079. ANDI T1,A0,07E0
  1080. OR A0,T1,T2
  1081. SLL T0,T0,0x1
  1082. LHU T3,0800 (T0) ;T3= A4000800[index]: next set of 8 GB pixels
  1083. ADDIU A2,A2,FFF8 ;#pixels -= 8
  1084. BGTZ A2,A400110C ;loop for remaining pixels
  1085. ADDIU A1,A1,0008 ;target += 8
  1086. @A40011D0: write line back to RDRAM
  1087. ORI A0,R0,0E88 ;RSP= A4000E88
  1088. OR A1,K0,R0 ;RDRAM= K0
  1089. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1090. ORI A2,R0,009F ;0xA0 bytes
  1091. @A40011E0: loop for each line
  1092. ADDIU K0,K0,FF60 ;K0 -= 0xA0: previous line
  1093. ADDIU S4,S4,FFF8 ;S4-=8: previous set of display flags
  1094. BGTZ S5,A4001084 ;lopo for remaining lines
  1095. ADDIU S5,S5,FFFF ;line count -=1
  1096. BEQ S6,R0,A4001210
  1097. NOP
  1098. @A40011F8: push this window to display buffer
  1099. ORI A0,R0,0800 ;RSP= A4000800
  1100. ADDIU A1,T8,1000 ;RDRAM= T8 + 0x1000
  1101. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1102. ORI A2,R0,00FF ;0x100 bytes
  1103. J A4001074
  1104. XORI S6,S6,0010
  1105. @A4001210
  1106. ADDIU T8,T8,FE00 ;T8-= 0x200
  1107. BGTZ S7,A4001060 ;repeat for banks 0-7
  1108. ADDIU S7,S7,FFFF ;S7-=1
  1109. @A400121C
  1110. ADDIU T8,GP,1200
  1111. ORI S7,R0,0007 ;S7= 7
  1112. ORI S6,R0,0010 ;S6= 0x10
  1113. ORI A0,R0,0800 ;RSP= A4000800
  1114. OR A1,T8,R0 ;RDRAM= GP + 0x1200
  1115. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1116. ORI A2,R0,01FF ;0x200 bytes
  1117. @A4001238
  1118. ORI S5,R0,008F ;S5= 0x8F: line#
  1119. ORI T0,R0,D4E0
  1120. ADDU K0,GP,T0 ;K0= GP + 0xD4E0: p->last line
  1121. SLL S4,S5,0x3 ;S4= line# * 8
  1122. LBU V0,0A00 (S4) ;V0= A4000A00[S5]
  1123. LBU T3,0A06 (S4) ;T3= A4000A06[S5]
  1124. OR T0,S6,S7
  1125. ANDI T1,V0,0010
  1126. XOR T0,T0,T1
  1127. ANDI T1,T3,0007
  1128. XOR T0,T0,T1
  1129. BNE T0,R0,A400137C
  1130. ANDI T1,V0,00A1
  1131. XORI T1,T1,00A1
  1132. BNE T1,R0,A400137C
  1133. LBU T4,0A07 (S4)
  1134. ORI A2,R0,00A7
  1135. SUBU A2,A2,T4
  1136. BLEZ A2,A400137C
  1137. ORI A0,R0,0E88 ;RSP= A4000E88
  1138. OR A1,K0,R0 ;RDRAM= K0
  1139. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1140. ORI A2,R0,009F ;0xA0 bytes
  1141. ANDI T0,V0,0040
  1142. SLL T0,T0,0x4
  1143. SRL T1,T3,0x3
  1144. SLL T1,T1,0x5
  1145. ADDU A0,T0,T1
  1146. @A40012A8: convert GB pixels at A4000800[@A0] to 8 palette indices
  1147. LBU T0,0000 (A0)
  1148. ANDI T1,A0,07E0
  1149. ADDIU T2,A0,0001
  1150. SLL T0,T0,0x1
  1151. LHU T3,0800 (T0)
  1152. ANDI T2,T2,001F
  1153. OR A0,T1,T2
  1154. ANDI T0,T3,8080
  1155. SRL T1,T0,0xE
  1156. SRL T0,T0,0x5
  1157. OR T0,T0,T1
  1158. SB T0,0E81 (T4)
  1159. ANDI T0,T3,4040
  1160. SRL T1,T0,0xD
  1161. SRL T0,T0,0x4
  1162. OR T0,T0,T1
  1163. SB T0,0E82 (T4)
  1164. ANDI T0,T3,2020
  1165. SRL T1,T0,0xC
  1166. SRL T0,T0,0x3
  1167. OR T0,T0,T1
  1168. SB T0,0E83 (T4)
  1169. ANDI T0,T3,1010
  1170. SRL T1,T0,0xB
  1171. SRL T0,T0,0x2
  1172. OR T0,T0,T1
  1173. SB T0,0E84 (T4)
  1174. ANDI T0,T3,0808
  1175. SRL T1,T0,0xA
  1176. SRL T0,T0,0x1
  1177. OR T0,T0,T1
  1178. SB T0,0E85 (T4)
  1179. ANDI T0,T3,0404
  1180. SRL T1,T0,0x9
  1181. OR T0,T0,T1
  1182. SB T0,0E86 (T4)
  1183. ANDI T0,T3,0202
  1184. SRL T1,T0,0x8
  1185. SLL T0,T0,0x1
  1186. OR T0,T0,T1
  1187. SB T0,0E87 (T4)
  1188. ANDI T1,T3,0101
  1189. SRL T2,T1,0x7
  1190. SLL T1,T1,0x2
  1191. OR T1,T1,T2
  1192. SB T1,0E88 (T4)
  1193. ADDIU A2,A2,FFF8
  1194. BGTZ A2,A40012A8
  1195. ADDIU T4,T4,0008
  1196. @A400136C
  1197. ORI A0,R0,0E88 ;RSP= A4000E88
  1198. OR A1,K0,R0 ;RDRAM= K0
  1199. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1200. ORI A2,R0,009F ;0xA0 bytes
  1201. @A400137C: loop for each line
  1202. ADDIU K0,K0,FF60 ;target -= 0xA0
  1203. ADDIU S4,S4,FFF8 ;#pixels -= 8
  1204. BGTZ S5,A4001248 ;loop for each line
  1205. ADDIU S5,S5,FFFF ;line# -=1
  1206. @A400138C
  1207. BEQ S6,R0,A40013AC
  1208. NOP
  1209. ORI A0,R0,0800 ;RSP= A4000800
  1210. ADDIU A1,T8,1000 ;RDRAM= T8 + 0x1000
  1211. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1212. ORI A2,R0,00FF ;0x100 bytes
  1213. J A4001238
  1214. XORI S6,S6,0010 ;S6 ^= 0x10
  1215. @A40013AC
  1216. ADDIU T8,T8,FE00 ;RDRAM -= 0x200
  1217. BGTZ S7,A4001224
  1218. ADDIU S7,S7,FFFF ;S7-=1
  1219. @A40013B8
  1220. LW A1,0FF8 (R0) ;RDRAM= @A4000FF8
  1221. ORI A0,R0,0000 ;RSP= A4000000
  1222. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1223. ORI A2,R0,009F ;0xA0 bytes
  1224. ADDIU S4,R0,009C
  1225. SW R0,0810 (R0)
  1226. SW R0,0814 (R0)
  1227. SW R0,0818 (R0)
  1228. SW R0,081C (R0)
  1229. LBU K0,0000 (S4) ;K0= A4000000[S4]
  1230. BEQ K0,R0,A400186C
  1231. SLTIU T0,K0,00A0
  1232. BEQ T0,R0,A400186C
  1233. LBU A3,0001 (S4)
  1234. BEQ A3,R0,A400186C
  1235. SLTIU T0,A3,00A8
  1236. BEQ T0,R0,A400186C
  1237. LBU S6,0002 (S4)
  1238. @A4001400
  1239. ORI A0,R0,0820 ;RSP= A4000820
  1240. ORI A2,R0,001F ;0x20 bytes
  1241. ANDI T0,S6,00FE
  1242. SLL T0,T0,0x4
  1243. ADDU T0,T0,GP
  1244. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1245. ADDIU A1,T0,8200 ;RDRAM= T0 - 0x7E00
  1246. LBU T4,0003 (S4)
  1247. ANDI T0,S6,0001
  1248. SLL S7,T0,0x4
  1249. ANDI T0,T4,0080
  1250. BNE T0,R0,A4001438
  1251. ORI V0,R0,007F
  1252. ANDI V0,R0,0000
  1253. @A4001438
  1254. ANDI T0,T4,0010
  1255. SRL T0,T0,0x4
  1256. ORI S6,R0,0010
  1257. SRLV S6,S6,T0
  1258. ANDI T0,T4,0040
  1259. BEQ T0,R0,A4001514
  1260. LHU T0,082E (S7)
  1261. LHU T1,082C (S7)
  1262. LHU T2,082A (S7)
  1263. LHU T3,0828 (S7)
  1264. SH T0,0800 (R0)
  1265. SH T1,0802 (R0)
  1266. SH T2,0804 (R0)
  1267. SH T3,0806 (R0)
  1268. LHU T0,0826 (S7)
  1269. LHU T1,0824 (S7)
  1270. LHU T2,0822 (S7)
  1271. LHU T3,0820 (S7)
  1272. SH T0,0808 (R0)
  1273. SH T1,080A (R0)
  1274. SH T2,080C (R0)
  1275. SH T3,080E (R0)
  1276. LHU T0,083E (R0)
  1277. LHU T1,083C (R0)
  1278. LHU T2,0820 (R0)
  1279. LHU T3,0822 (R0)
  1280. SH T0,0820 (R0)
  1281. SH T1,0822 (R0)
  1282. SH T2,083E (R0)
  1283. SH T3,083C (R0)
  1284. LHU T0,083A (R0)
  1285. LHU T1,0838 (R0)
  1286. LHU T2,0824 (R0)
  1287. LHU T3,0826 (R0)
  1288. SH T0,0824 (R0)
  1289. SH T1,0826 (R0)
  1290. SH T2,083A (R0)
  1291. SH T3,0838 (R0)
  1292. LHU T0,0836 (R0)
  1293. LHU T1,0834 (R0)
  1294. LHU T2,0828 (R0)
  1295. LHU T3,082A (R0)
  1296. SH T0,0828 (R0)
  1297. SH T1,082A (R0)
  1298. SH T2,0836 (R0)
  1299. SH T3,0834 (R0)
  1300. LHU T0,0832 (R0)
  1301. LHU T1,0830 (R0)
  1302. LHU T2,082C (R0)
  1303. LHU T3,082E (R0)
  1304. SH T0,082C (R0)
  1305. SH T1,082E (R0)
  1306. SH T2,0832 (R0)
  1307. J A4001550
  1308. SH T3,0830 (R0)
  1309. LHU T1,082C (S7)
  1310. LHU T2,082A (S7)
  1311. LHU T3,0828 (S7)
  1312. SH T0,080E (R0)
  1313. SH T1,080C (R0)
  1314. SH T2,080A (R0)
  1315. SH T3,0808 (R0)
  1316. LHU T0,0826 (S7)
  1317. LHU T1,0824 (S7)
  1318. LHU T2,0822 (S7)
  1319. LHU T3,0820 (S7)
  1320. SH T0,0806 (R0)
  1321. SH T1,0804 (R0)
  1322. SH T2,0802 (R0)
  1323. SH T3,0800 (R0)
  1324. SLTIU T0,K0,0010
  1325. ANDI T8,R0,0000
  1326. ORI S7,R0,0010
  1327. SUBU S7,S7,K0
  1328. SLL S7,S7,0x1
  1329. BNE T0,R0,A4001588
  1330. OR S5,K0,R0
  1331. ADDIU T8,K0,FFF0
  1332. ANDI S7,R0,0000
  1333. SLTIU T0,K0,0091
  1334. BNE T0,R0,A4001588
  1335. ORI S5,R0,0010
  1336. ORI S5,R0,00A0
  1337. SUBU S5,S5,K0
  1338. SLL T1,T8,0x2
  1339. ADDU T1,T1,T8
  1340. SLL T1,T1,0x5
  1341. ADDIU T1,T1,7B80
  1342. ADDU A1,T1,GP
  1343. SLL T0,T8,0x3
  1344. LBU T0,0A00 (T0)
  1345. ANDI T1,T0,0082
  1346. XORI T1,T1,0082
  1347. BNE T1,R0,A4001858
  1348. ANDI T1,T0,0004
  1349. SLL T1,T1,0x3
  1350. ADDU T1,T1,S7
  1351. LHU T3,0800 (T1)
  1352. BEQ T3,R0,A4001858
  1353. ORI A0,R0,0E88 ;RSP= A4000E88
  1354. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1355. ORI A2,R0,009F ;0xA0 bytes
  1356. ANDI T1,T4,0020
  1357. BEQ T1,R0,A4001718
  1358. ANDI T0,T3,8080
  1359. BEQ T0,R0,A4001604
  1360. ANDI T1,T3,4040
  1361. LBU T9,0E87 (A3)
  1362. SRL T2,T0,0xE
  1363. SRL T0,T0,0x5
  1364. AND T9,T9,V0
  1365. BNE T9,R0,A4001604
  1366. OR T2,T2,T0
  1367. OR T2,T2,S6
  1368. SB T2,0E87 (A3)
  1369. BEQ T1,R0,A400162C
  1370. ANDI T0,T3,2020
  1371. LBU T9,0E86 (A3)
  1372. SRL T2,T1,0xD
  1373. SRL T1,T1,0x4
  1374. AND T9,T9,V0
  1375. BNE T9,R0,A400162C
  1376. OR T2,T2,T1
  1377. OR T2,T2,S6
  1378. SB T2,0E86 (A3)
  1379. BEQ T0,R0,A4001654
  1380. ANDI T1,T3,1010
  1381. LBU T9,0E85 (A3)
  1382. SRL T2,T0,0xC
  1383. SRL T0,T0,0x3
  1384. AND T9,T9,V0
  1385. BNE T9,R0,A4001654
  1386. OR T2,T2,T0
  1387. OR T2,T2,S6
  1388. SB T2,0E85 (A3)
  1389. BEQ T1,R0,A400167C
  1390. ANDI T0,T3,0808
  1391. LBU T9,0E84 (A3)
  1392. SRL T2,T1,0xB
  1393. SRL T1,T1,0x2
  1394. AND T9,T9,V0
  1395. BNE T9,R0,A400167C
  1396. OR T2,T2,T1
  1397. OR T2,T2,S6
  1398. SB T2,0E84 (A3)
  1399. BEQ T0,R0,A40016A4
  1400. ANDI T1,T3,0404
  1401. LBU T9,0E83 (A3)
  1402. SRL T2,T0,0xA
  1403. SRL T0,T0,0x1
  1404. AND T9,T9,V0
  1405. BNE T9,R0,A40016A4
  1406. OR T2,T2,T0
  1407. OR T2,T2,S6
  1408. SB T2,0E83 (A3)
  1409. BEQ T1,R0,A40016C8
  1410. ANDI T0,T3,0202
  1411. LBU T9,0E82 (A3)
  1412. SRL T2,T1,0x9
  1413. OR T2,T2,T1
  1414. AND T9,T9,V0
  1415. BNE T9,R0,A40016C8
  1416. OR T2,T2,S6
  1417. SB T2,0E82 (A3)
  1418. BEQ T0,R0,A40016F0
  1419. ANDI T1,T3,0101
  1420. LBU T9,0E81 (A3)
  1421. SRL T2,T0,0x8
  1422. SLL T0,T0,0x1
  1423. AND T9,T9,V0
  1424. BNE T9,R0,A40016C8
  1425. OR T2,T2,T0
  1426. OR T2,T2,S6
  1427. SB T2,0E81 (A3)
  1428. BEQ T1,R0,A4001850
  1429. LBU T9,0E80 (A3)
  1430. SRL T2,T1,0x7
  1431. SLL T1,T1,0x2
  1432. AND T9,T9,V0
  1433. BNE T9,R0,A40016F0
  1434. OR T2,T2,T1
  1435. OR T2,T2,S6
  1436. J A4001850
  1437. SB T2,0E80 (A3)
  1438. BEQ T0,R0,A4001740
  1439. ANDI T1,T3,4040
  1440. LBU T9,0E80 (A3)
  1441. SRL T2,T0,0xE
  1442. SRL T0,T0,0x5
  1443. AND T9,T9,V0
  1444. BNE T9,R0,A4001740
  1445. OR T2,T2,T0
  1446. OR T2,T2,S6
  1447. SB T2,0E80 (A3)
  1448. BEQ T1,R0,A4001768
  1449. ANDI T0,T3,2020
  1450. LBU T9,0E81 (A3)
  1451. SRL T2,T1,0xD
  1452. SRL T1,T1,0x4
  1453. AND T9,T9,V0
  1454. BNE T9,R0,A4001768
  1455. OR T2,T2,T1
  1456. OR T2,T2,S6
  1457. SB T2,0E81 (A3)
  1458. BEQ T0,R0,A4001790
  1459. ANDI T1,T3,1010
  1460. LBU T9,0E82 (A3)
  1461. SRL T2,T0,0xC
  1462. SRL T0,T0,0x3
  1463. AND T9,T9,V0
  1464. BNE T9,R0,A4001790
  1465. OR T2,T2,T0
  1466. OR T2,T2,S6
  1467. SB T2,0E82 (A3)
  1468. BEQ T1,R0,A40017B8
  1469. ANDI T0,T3,0808
  1470. LBU T9,0E83 (A3)
  1471. SRL T2,T1,0xB
  1472. SRL T1,T1,0x2
  1473. AND T9,T9,V0
  1474. BNE T9,R0,A40017B8
  1475. OR T2,T2,T1
  1476. OR T2,T2,S6
  1477. SB T2,0E83 (A3)
  1478. BEQ T0,R0,A40017E0
  1479. ANDI T1,T3,0404
  1480. LBU T9,0E84 (A3)
  1481. SRL T2,T0,0xA
  1482. SRL T0,T0,0x1
  1483. AND T9,T9,V0
  1484. BNE T9,R0,A40017E0
  1485. OR T2,T2,T0
  1486. OR T2,T2,S6
  1487. SB T2,0E84 (A3)
  1488. BEQ T1,R0,A4001804
  1489. ANDI T0,T3,0202
  1490. LBU T9,0E85 (A3)
  1491. SRL T2,T1,0x9
  1492. OR T2,T2,T1
  1493. AND T9,T9,V0
  1494. BNE T9,R0,A4001804
  1495. OR T2,T2,S6
  1496. SB T2,0E85 (A3)
  1497. BEQ T0,R0,A400182C
  1498. ANDI T1,T3,0101
  1499. LBU T9,0E86 (A3)
  1500. SRL T2,T0,0x8
  1501. SLL T0,T0,0x1
  1502. AND T9,T9,V0
  1503. BNE T9,R0,A400182C
  1504. OR T2,T2,T0
  1505. OR T2,T2,S6
  1506. SB T2,0E86 (A3)
  1507. BEQ T1,R0,A4001850
  1508. LBU T9,0E87 (A3)
  1509. SRL T2,T1,0x7
  1510. SLL T1,T1,0x2
  1511. AND T9,T9,V0
  1512. BNE T9,R0,A400182C
  1513. OR T2,T2,T1
  1514. OR T2,T2,S6
  1515. SB T2,0E87 (A3)
  1516. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1517. NOP
  1518. ADDIU A1,A1,00A0 ;A1+=0xA0: target's next line
  1519. ADDIU S7,S7,0002
  1520. ADDIU S5,S5,FFFF
  1521. BGTZ S5,A400159C
  1522. ADDIU T8,T8,0001
  1523. BGTZ S4,A40013CC
  1524. ADDIU S4,S4,FFFC
  1525. LBU T0,0FDF (R0) ;T0= @A4000FDF
  1526. ANDI T1,T0,00C0
  1527. BEQ T1,R0,A40018B4 ;skip if 0xC0 flags not set
  1528. ANDI T1,T0,003F
  1529. SRL T1,T1,0x1 ;T1= (T0 & 0x3E)>>1: #initial color conversion index
  1530. SUBU T0,R0,T1 ;T0= ~T1
  1531. ORI T1,R0,0000 ;T1= 0: count
  1532. ORI T2,R0,001F ;T2= 0x1F: #entries
  1533. @ A4001894: roll conversion around
  1534. BGEZ T0,A40018A0
  1535. OR T3,T0,R0
  1536. ANDI T3,R0,0000
  1537. @ A40018A0: build color conversion table
  1538. SB T3,0FA0 (T1)
  1539. ADDIU T0,T0,0001
  1540. ADDIU T1,T1,0001
  1541. BGTZ T2,A4001894
  1542. ADDIU T2,T2,FFFF
  1543. @ A40018B4
  1544. ORI A0,R0,0700 ;RSP= A4000700
  1545. ADDIU A1,GP,4A00 ;RDRAM= GP + 0x4A00
  1546. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1547. ORI A2,R0,01FF ;0x200 bytes
  1548. LBU T2,0FDF (R0)
  1549. ANDI T2,T2,0040
  1550. BEQ T2,R0,A40018DC
  1551. ORI A0,R0,0700 ;A0= A4000700
  1552. JAL A4001DE4 ;translate A2 16bit pixels at A0 with color table A4000FA0
  1553. ORI A2,R0,0100 ;0x100 pixels (0x200)
  1554. ORI T1,R0,027E
  1555. SH R0,0400 (T1)
  1556. BGTZ T1,A40018E0
  1557. ADDIU T1,T1,FFFE
  1558. LBU T1,0FDE (R0)
  1559. LBU T0,0FDD (R0)
  1560. LBU S7,0FDC (R0)
  1561. LW K1,0FE8 (R0)
  1562. SLL S7,S7,0x1
  1563. BEQ T1,R0,A4001A00
  1564. ANDI T8,R0,0000
  1565. LW T8,0FE0 (R0)
  1566. ORI T1,R0,EF00
  1567. ADDU T8,T8,T1
  1568. SLTIU T2,T0,0060
  1569. BEQ T2,R0,A4001A00
  1570. ADDIU T2,T0,008F
  1571. LUI T1,0002
  1572. ORI T1,T1,5580
  1573. ADDU T9,K1,T1
  1574. LBU V0,0FD4 (R0)
  1575. BEQ V0,R0,A4001958
  1576. LBU T1,0FD5 (R0)
  1577. LW A3,0FD0 (R0)
  1578. ADDIU T3,V0,FFFF
  1579. ADDIU T0,V0,FF0F
  1580. ADDU V0,T0,T1
  1581. SLL T0,T3,0x2
  1582. ADDU T0,T0,T3
  1583. SLL T0,T0,0x7
  1584. ADDU A3,A3,T0
  1585. ADDIU S5,T2,FF12
  1586. ORI A0,R0,0900 ;RSP= A4000900
  1587. OR A1,T8,R0 ;RDRAM= T8
  1588. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1589. ORI A2,R0,00FF ;0x100 bytes
  1590. JAL A4001DA4
  1591. ORI A2,R0,027F
  1592. BEQ V0,R0,A40019E0
  1593. NOP
  1594. BLTZ V0,A4001998
  1595. NOP
  1596. ADDIU V0,V0,FFFF
  1597. BNE V0,R0,A40019A8
  1598. NOP
  1599. J A40019E0
  1600. NOP
  1601. ADDIU V0,V0,0001
  1602. BNE V0,R0,A40019E0
  1603. NOP
  1604. LBU V0,0FD4 (R0)
  1605. ORI A0,R0,0180 ;RSP= A4000180
  1606. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1607. OR A1,A3,R0 ;RDRAM= A3
  1608. ADDIU A3,A3,FD80
  1609. ORI A0,R0,027C
  1610. LHU T0,0180 (A0)
  1611. LHU T1,0182 (A0)
  1612. BEQ T0,R0,A40019D0
  1613. NOP
  1614. SH T0,0400 (A0)
  1615. BEQ T1,R0,A40019DC
  1616. ADDIU A0,A0,FFFC
  1617. SH T1,0406 (A0)
  1618. BGTZ A0,A40019BC
  1619. OR A1,T9,R0 ;RDRAM= T9
  1620. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1621. ORI A0,R0,0400 ;RSP= A4000400
  1622. ADDIU T8,T8,FF00
  1623. ADDIU S5,S5,0001
  1624. BLEZ S5,A400195C
  1625. ADDIU T9,T9,FD80
  1626. LBU T0,0FDD (R0)
  1627. BEQ T8,R0,A4001A9C
  1628. ADDIU T0,T0,008F
  1629. SLL T1,T0,0x2
  1630. ADDU T1,T1,T0
  1631. SLL T1,T1,0x7
  1632. ADDU T9,K1,T1
  1633. ADDIU S5,R0,FF71
  1634. ORI A0,R0,0400 ;RSP= A4000400
  1635. OR A1,T9,R0 ;RDRAM= T9
  1636. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1637. ORI A2,R0,027F ;0x280 bytes
  1638. ORI A0,R0,0900 ;A4000900
  1639. OR A1,T8,R0 ;RDRAM= T8
  1640. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1641. ORI A2,R0,00FF ;0x100 bytes
  1642. ORI T0,R0,0030
  1643. SLL T1,T0,0x1
  1644. ADDU T1,T1,S7
  1645. @ A4001A48
  1646. LBU T2,09CF (T0)
  1647. LBU T3,09CE (T0)
  1648. ADDIU T0,T0,FFFE
  1649. SLL T2,T2,0x1
  1650. SLL T3,T3,0x1
  1651. LHU T2,0700 (T2)
  1652. LHU T3,0700 (T3)
  1653. ADDIU T1,T1,FFFC
  1654. SH T2,05A2 (T1)
  1655. BGTZ T0,A4001A48
  1656. SH T3,05A0 (T1)
  1657. ORI T0,R0,0030
  1658. JAL A4001DA8
  1659. ORI A2,R0,027F
  1660. OR A1,T9,R0 ;RDRAM= T9
  1661. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1662. ORI A0,R0,0400 ;RSP= A4000400
  1663. ADDIU T8,T8,FF00
  1664. ADDIU S5,S5,0001
  1665. BLEZ S5,A4001A1C
  1666. ADDIU T9,T9,FD80
  1667. @ A4001A9C
  1668. ADDIU T9,GP,4000
  1669. ORI S5,R0,0060
  1670. ORI T0,R0,B780
  1671. ADDU K0,GP,T0
  1672. SLL S4,S5,0x3
  1673. ORI A0,R0,0000 ;RSP= A4000000
  1674. OR A1,K0,R0 ;RDRAM= K0
  1675. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1676. ORI A2,R0,04FF ;0x500 bytes
  1677. LBU T0,0A03 (S4)
  1678. LHU T1,0A04 (S4)
  1679. ORI A1,R0,0098
  1680. ORI A2,R0,0130
  1681. SLL T0,T0,0x1
  1682. SLL T1,T1,0x9
  1683. OR S6,T0,T1
  1684. @ A4001ADC: convert 1 line of pixels at T1 back to GB format at T2
  1685. ADDIU T1,A1,0460 ;T1= A1+0x460: line 7
  1686. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1687. ADDIU T2,A2,000E ;T2= A4000130+0xE: p->target
  1688. ADDIU T1,A1,03C0 ;T1= A1+0x3C0: line 6
  1689. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1690. ADDIU T2,A2,000C ;T2= A4000130+0xC: p->target
  1691. ADDIU T1,A1,0320 ;T1= A1+0x320: line 5
  1692. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1693. ADDIU T2,A2,000A ;T2= A4000130+0xA: p->target
  1694. ADDIU T1,A1,0280 ;T1= A1+0x280: line 4
  1695. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1696. ADDIU T2,A2,0008 ;T2= A4000130+8: p->target
  1697. ADDIU T1,A1,01E0 ;T1= A1+0x1E0: line 3
  1698. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1699. ADDIU T2,A2,0006 ;T2= A4000130+6: p->target
  1700. ADDIU T1,A1,0140 ;T1= A1+0x140: line 2
  1701. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1702. ADDIU T2,A2,0004 ;T2= A4000130+4: p->target
  1703. ADDIU T1,A1,00A0 ;T1= A1+0xA0: line 1
  1704. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1705. ADDIU T2,A2,0002 ;T2= A4000130+2: p->target
  1706. ADDIU T1,A1,0000 ;T1= A1+0: line 0
  1707. JAL A4001B70 ;set GB pixels at T2 from palette entries at T1
  1708. ADDIU T2,A2,0000 ;T2= A4000130+0: p->target
  1709. ADDIU A1,A1,FFF8
  1710. BGEZ A1,A4001ADC
  1711. ADDIU A2,A2,FFF0
  1712. @ A4001B48: write GB pixel data back to rdram at T9
  1713. ORI A0,R0,0500 ;RSP= A4000500
  1714. OR A1,T9,R0 ;RDRAM= T9
  1715. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1716. ORI A2,R0,013F ;0x140 bytes
  1717. ADDIU T9,T9,FEC0
  1718. ADDIU K0,K0,FB00 ;K0 -= 0x500
  1719. BGTZ S5,A4001AB0 ;write to each of 7 buffers
  1720. ADDIU S5,S5,FFF8
  1721. J A4001C70
  1722. NOP
  1723.  
  1724. A4001B70 set GB pixels at T2 from palette entries at T1
  1725. LBU A3,0000 (T1) ;A3= source[0]
  1726. SRLV A3,S6,A3
  1727. ANDI T0,A3,0002
  1728. SLL T4,T0,0xE ;T4= 0x4000 if A3 & 2 else 0
  1729. ANDI T0,A3,0004
  1730. SLL T0,T0,0x5 ;T0= 0x20 if A3 & 4 else 0
  1731. OR T4,T4,T0 ;T4= 4020
  1732. LBU T3,0001 (T1) ;T3= source[1]
  1733. SRLV T3,S6,T3
  1734. ANDI T0,T3,0002
  1735. SLL T0,T0,0xD ;T0= 0x2000 if T3 & 2 else 0
  1736. OR T4,T4,T0 ;T4= 6020
  1737. ANDI T0,T3,0004
  1738. SLL T0,T0,0x4 ;T0= 0x10 if T3 & 4 else 0
  1739. OR T4,T4,T0 ;T4= 6030
  1740. LBU A3,0002 (T1)
  1741. SRLV A3,S6,A3
  1742. ANDI T0,A3,0002
  1743. SLL T0,T0,0xC
  1744. OR T4,T4,T0
  1745. ANDI T0,A3,0004
  1746. SLL T0,T0,0x3
  1747. OR T4,T4,T0
  1748. LBU T3,0003 (T1)
  1749. SRLV T3,S6,T3
  1750. ANDI T0,T3,0002
  1751. SLL T0,T0,0xB
  1752. OR T4,T4,T0
  1753. ANDI T0,T3,0004
  1754. SLL T0,T0,0x2
  1755. OR T4,T4,T0
  1756. LBU A3,0004 (T1)
  1757. SRLV A3,S6,A3
  1758. ANDI T0,A3,0002
  1759. SLL T0,T0,0xA
  1760. OR T4,T4,T0
  1761. ANDI T0,A3,0004
  1762. SLL T0,T0,0x1
  1763. OR T4,T4,T0
  1764. LBU T3,0005 (T1)
  1765. SRLV T3,S6,T3
  1766. ANDI T0,T3,0002
  1767. SLL T0,T0,0x9
  1768. OR T4,T4,T0
  1769. ANDI T0,T3,0004
  1770. OR T4,T4,T0
  1771. LBU A3,0006 (T1)
  1772. SRLV A3,S6,A3
  1773. ANDI T0,A3,0002
  1774. SLL T0,T0,0x8
  1775. OR T4,T4,T0
  1776. ANDI T0,A3,0004
  1777. SRL T0,T0,0x1
  1778. OR T4,T4,T0
  1779. LBU T3,0007 (T1)
  1780. SRLV T3,S6,T3
  1781. ANDI T0,T3,0002
  1782. SLL T0,T0,0x7
  1783. OR T4,T4,T0
  1784. ANDI T0,T3,0004
  1785. SRL T0,T0,0x2
  1786. OR T4,T4,T0
  1787. JR RA
  1788. SH T4,0500 (T2) ;T2+500= pixel
  1789.  
  1790. A4001C70
  1791. BEQ T8,R0,A4001CD4
  1792. LBU T0,0FDD (R0)
  1793. BEQ T0,R0,A4001CD4
  1794. ADDIU S5,T0,FFFF
  1795. ORI T0,R0,027C
  1796. SW R0,0400 (T0)
  1797. BGTZ T0,A4001C84
  1798. ADDIU T0,T0,FFFC
  1799. SLL T1,S5,0x2
  1800. ADDU T1,T1,S5
  1801. SLL T1,T1,0x7 ;T1= S5 * 0x280
  1802. ADDU T9,K1,T1
  1803. @ A4001CA0
  1804. ORI A0,R0,0900 ;RSP= A4000900
  1805. OR A1,T8,R0 ;RDRAM= T8
  1806. JAL A4001D5C ;read A2 bytes between RSP A0 and rdram A1
  1807. ORI A2,R0,00FF ;0x100 bytes
  1808. JAL A4001DA4
  1809. ORI A0,R0,0400 ;RSP= A4000400
  1810. OR A1,T9,R0 ;RDRAM= T9
  1811. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1812. ORI A2,R0,027F ;0x280 bytes
  1813. ADDIU T8,T8,FF00
  1814. ADDIU S5,S5,FFFF
  1815. BGEZ S5,A4001CA0
  1816. ADDIU T9,T9,FD80
  1817. NOP
  1818. ORI T0,R0,027C
  1819. @ A4001CDC
  1820. SW R0,0400 (T0)
  1821. BGTZ T0,A4001CDC
  1822. ADDIU T0,T0,FFFC
  1823. ORI S5,R0,0007
  1824. ORI A0,R0,0400 ;RSP =A4000400
  1825. OR A1,K1,R0 ;RDRAM= K1
  1826. @ A4001CF4: copy buffer 7 times to rdram
  1827. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1828. ORI A2,R0,027F ;0x280 bytes
  1829. ADDIU A1,A1,0280 ;target += 0x280
  1830. BGTZ S5,A4001CF4 ;count -= 1
  1831. ADDIU S5,S5,FFFF
  1832. ORI S5,R0,0007 ;S5= 7: count
  1833. LUI T0,0002
  1834. ORI T0,T0,4400
  1835. ADDU A1,K1,T0 ;RDRAM= K1 + 0x24400
  1836. @ A4001D18: copy buffer 7 times to rdram+0x24400
  1837. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1838. ORI A2,R0,027F ;0x280 bytes
  1839. ADDIU A1,A1,0280 ;target += 0x280
  1840. BGTZ S5,A4001D18 ;count -= 1
  1841. ADDIU S5,S5,FFFF
  1842. @ A4001D2C: send signal and break function
  1843. ORI AT,R0,4000
  1844. MTC0 AT,SP-Status ;SP Status: set signal 2
  1845. BREAK 00000000
  1846. NOP
  1847. @ A4001D3C
  1848. LUI A1,0061 ;RDRAM= 0x610000
  1849. ORI A0,R0,0000 ;RSP= A4000000
  1850. JAL A4001D54 ;write A2 bytes between RSP A0 and rdram A1
  1851. ORI A2,R0,0FFF ;0x1000 bytes
  1852. J A4001D2C
  1853. NOP
  1854.  
  1855. A4001D54 write A2 bytes between RSP A0 and rdram A1
  1856. J A4001D60 ;read or write (A0 & 0x8000) A2 bytes between RSP A0 and rdram A1
  1857. ORI A0,A0,8000 ;length | = 0x8000: write
  1858.  
  1859. A4001D5C read A2 bytes between RSP A0 and rdram A1
  1860. ANDI A0,A0,7FFF
  1861.  
  1862. A4001D60 read or write (A0 & 0x8000) A2 bytes between RSP A0 and rdram A1
  1863. accepts: A0=mode|address, A1=p->rdram, A2=length
  1864. MFC0 AT,SP-Semaphore
  1865. BNE AT,R0,A4001D60
  1866. MFC0 AT,SP-DMA Full
  1867. BNE AT,R0,A4001D68
  1868. ANDI AT,A0,8000
  1869. ANDI A0,A0,7FFF
  1870. MTC0 A0,SP-Memory Address
  1871. BNE AT,R0,A4001D8C
  1872. MTC0 A1,SP-DRAM Address
  1873. J A4001D90
  1874. MTC0 A2,SP-Read Length
  1875. @ A4001D8C
  1876. MTC0 A2,SP-Write Length
  1877. @ A4001D90
  1878. MFC0 AT,SP-DMA Busy
  1879. BNE AT,R0,A4001D90
  1880. NOP
  1881. JR RA
  1882. MTC0 R0,SP-Semaphore
  1883.  
  1884. A4001DA4
  1885. ORI T0,R0,0100
  1886. SLL T1,T0,0x1
  1887. ADDU T1,T1,S7
  1888. LBU T2,08FF (T0)
  1889. LBU T3,08FE (T0)
  1890. ADDIU T0,T0,FFFE
  1891. SLL T2,T2,0x1
  1892. SLL T3,T3,0x1
  1893. LHU T2,0700 (T2)
  1894. LHU T3,0700 (T3)
  1895. ADDIU T1,T1,FFFC
  1896. SH T2,0402 (T1)
  1897. BGTZ T0,A4001DB0
  1898. SH T3,0400 (T1)
  1899. JR RA
  1900. NOP
  1901.  
  1902. A4001DE4 translate A2 16bit pixels at A0 with color table A4000FA0
  1903. accepts: A0=p->image, A1=(unused), A2=#pixels
  1904. LHU T0,0000 (A0) ;T0= next pixel
  1905. ADDIU A2,A2,FFFF ;count-=1
  1906. ADDIU A0,A0,0002 ;source+=2
  1907. SRL T1,T0,0xB ;T1= pixel / 0x800: range(0:0x1F) F800: red
  1908. LBU T1,0FA0 (T1) ;T1= A4000FA0[T1]: corrected red
  1909. SRL T2,T0,0x6
  1910. ANDI T2,T2,001F ;T2= pixel / 0x40: range(0:0x1F) 07E0: green
  1911. LBU T2,0FA0 (T2) ;T2= A4000FA0[T2]: corrected green
  1912. SRL T3,T0,0x1
  1913. ANDI T3,T3,001F ;T3= pixel / 2: range(0:0x1F) 003E: blue
  1914. LBU T3,0FA0 (T3) ;T3= A4000FA0[T3]: corrected blue
  1915. SLL T1,T1,0xB
  1916. SLL T2,T2,0x6
  1917. SLL T3,T3,0x1
  1918. OR T1,T1,T2
  1919. OR T1,T1,T3 ;T1= red | green | blue (no alpha)
  1920. BGTZ A2,A4001DE4 ;loop for count
  1921. SH T1,FFFE (A0) ;update pixel
  1922. @ 8112029C: return
  1923. JR RA
  1924. NOP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement