Memory_mips_r5900.s 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. # vim:filetype=mips
  2. # memory handlers with banking support for SSF II - The New Challengers
  3. # mostly based on Gens code
  4. # For the MIPS R5900. Based on Memory_amips.s by Notaz.
  5. # (c) Copyright 2007, Grazvydas "notaz" Ignotas
  6. # All Rights Reserved
  7. .set noreorder
  8. .set noat #$at is currently used in the substitute macro instructions (and some replacement code).
  9. .text
  10. .align 4
  11. .macro ext dest,src,pos,size
  12. srl \dest, \src, \pos
  13. li $at, ((1 << \size) - 1)
  14. and \dest, $at
  15. .endm
  16. # default jump tables
  17. m_read8_def_table:
  18. .long m_read8_rom0 # 0x000000 - 0x07FFFF
  19. .long m_read8_rom1 # 0x080000 - 0x0FFFFF
  20. .long m_read8_rom2 # 0x100000 - 0x17FFFF
  21. .long m_read8_rom3 # 0x180000 - 0x1FFFFF
  22. .long m_read8_rom4 # 0x200000 - 0x27FFFF
  23. .long m_read8_rom5 # 0x280000 - 0x2FFFFF
  24. .long m_read8_rom6 # 0x300000 - 0x37FFFF
  25. .long m_read8_rom7 # 0x380000 - 0x3FFFFF
  26. .long m_read8_rom8 # 0x400000 - 0x47FFFF - for all those large ROM hacks
  27. .long m_read8_rom9 # 0x480000 - 0x4FFFFF
  28. .long m_read8_romA # 0x500000 - 0x57FFFF
  29. .long m_read8_romB # 0x580000 - 0x5FFFFF
  30. .long m_read8_romC # 0x600000 - 0x67FFFF
  31. .long m_read8_romD # 0x680000 - 0x6FFFFF
  32. .long m_read8_romE # 0x700000 - 0x77FFFF
  33. .long m_read8_romF # 0x780000 - 0x7FFFFF
  34. .long m_read8_rom10 # 0x800000 - 0x87FFFF
  35. .long m_read8_rom11 # 0x880000 - 0x8FFFFF
  36. .long m_read8_rom12 # 0x900000 - 0x97FFFF
  37. .long m_read8_rom13 # 0x980000 - 0x9FFFFF
  38. .long m_read8_misc # 0xA00000 - 0xA7FFFF
  39. .long m_read_null # 0xA80000 - 0xAFFFFF
  40. .long m_read_null # 0xB00000 - 0xB7FFFF
  41. .long m_read_null # 0xB80000 - 0xBFFFFF
  42. .long m_read8_vdp # 0xC00000 - 0xC7FFFF
  43. .long m_read8_vdp # 0xC80000 - 0xCFFFFF
  44. .long m_read8_vdp # 0xD00000 - 0xD7FFFF
  45. .long m_read8_vdp # 0xD80000 - 0xDFFFFF
  46. .long m_read8_ram # 0xE00000 - 0xE7FFFF
  47. .long m_read8_ram # 0xE80000 - 0xEFFFFF
  48. .long m_read8_ram # 0xF00000 - 0xF7FFFF
  49. .long m_read8_ram # 0xF80000 - 0xFFFFFF
  50. m_read16_def_table:
  51. .long m_read16_rom0 # 0x000000 - 0x07FFFF
  52. .long m_read16_rom1 # 0x080000 - 0x0FFFFF
  53. .long m_read16_rom2 # 0x100000 - 0x17FFFF
  54. .long m_read16_rom3 # 0x180000 - 0x1FFFFF
  55. .long m_read16_rom4 # 0x200000 - 0x27FFFF
  56. .long m_read16_rom5 # 0x280000 - 0x2FFFFF
  57. .long m_read16_rom6 # 0x300000 - 0x37FFFF
  58. .long m_read16_rom7 # 0x380000 - 0x3FFFFF
  59. .long m_read16_rom8 # 0x400000 - 0x47FFFF
  60. .long m_read16_rom9 # 0x480000 - 0x4FFFFF
  61. .long m_read16_romA # 0x500000 - 0x57FFFF
  62. .long m_read16_romB # 0x580000 - 0x5FFFFF
  63. .long m_read16_romC # 0x600000 - 0x67FFFF
  64. .long m_read16_romD # 0x680000 - 0x6FFFFF
  65. .long m_read16_romE # 0x700000 - 0x77FFFF
  66. .long m_read16_romF # 0x780000 - 0x7FFFFF
  67. .long m_read16_rom10 # 0x800000 - 0x87FFFF
  68. .long m_read16_rom11 # 0x880000 - 0x8FFFFF
  69. .long m_read16_rom12 # 0x900000 - 0x97FFFF
  70. .long m_read16_rom13 # 0x980000 - 0x9FFFFF
  71. .long m_read16_misc # 0xA00000 - 0xA7FFFF
  72. .long m_read_null # 0xA80000 - 0xAFFFFF
  73. .long m_read_null # 0xB00000 - 0xB7FFFF
  74. .long m_read_null # 0xB80000 - 0xBFFFFF
  75. .long m_read16_vdp # 0xC00000 - 0xC7FFFF
  76. .long m_read16_vdp # 0xC80000 - 0xCFFFFF
  77. .long m_read16_vdp # 0xD00000 - 0xD7FFFF
  78. .long m_read16_vdp # 0xD80000 - 0xDFFFFF
  79. .long m_read16_ram # 0xE00000 - 0xE7FFFF
  80. .long m_read16_ram # 0xE80000 - 0xEFFFFF
  81. .long m_read16_ram # 0xF00000 - 0xF7FFFF
  82. .long m_read16_ram # 0xF80000 - 0xFFFFFF
  83. m_read32_def_table:
  84. .long m_read32_rom0 # 0x000000 - 0x07FFFF
  85. .long m_read32_rom1 # 0x080000 - 0x0FFFFF
  86. .long m_read32_rom2 # 0x100000 - 0x17FFFF
  87. .long m_read32_rom3 # 0x180000 - 0x1FFFFF
  88. .long m_read32_rom4 # 0x200000 - 0x27FFFF
  89. .long m_read32_rom5 # 0x280000 - 0x2FFFFF
  90. .long m_read32_rom6 # 0x300000 - 0x37FFFF
  91. .long m_read32_rom7 # 0x380000 - 0x3FFFFF
  92. .long m_read32_rom8 # 0x400000 - 0x47FFFF
  93. .long m_read32_rom9 # 0x480000 - 0x4FFFFF
  94. .long m_read32_romA # 0x500000 - 0x57FFFF
  95. .long m_read32_romB # 0x580000 - 0x5FFFFF
  96. .long m_read32_romC # 0x600000 - 0x67FFFF
  97. .long m_read32_romD # 0x680000 - 0x6FFFFF
  98. .long m_read32_romE # 0x700000 - 0x77FFFF
  99. .long m_read32_romF # 0x780000 - 0x7FFFFF
  100. .long m_read32_rom10 # 0x800000 - 0x87FFFF
  101. .long m_read32_rom11 # 0x880000 - 0x8FFFFF
  102. .long m_read32_rom12 # 0x900000 - 0x97FFFF
  103. .long m_read32_rom13 # 0x980000 - 0x9FFFFF
  104. .long m_read32_misc # 0xA00000 - 0xA7FFFF
  105. .long m_read_null # 0xA80000 - 0xAFFFFF
  106. .long m_read_null # 0xB00000 - 0xB7FFFF
  107. .long m_read_null # 0xB80000 - 0xBFFFFF
  108. .long m_read32_vdp # 0xC00000 - 0xC7FFFF
  109. .long m_read32_vdp # 0xC80000 - 0xCFFFFF
  110. .long m_read32_vdp # 0xD00000 - 0xD7FFFF
  111. .long m_read32_vdp # 0xD80000 - 0xDFFFFF
  112. .long m_read32_ram # 0xE00000 - 0xE7FFFF
  113. .long m_read32_ram # 0xE80000 - 0xEFFFFF
  114. .long m_read32_ram # 0xF00000 - 0xF7FFFF
  115. .long m_read32_ram # 0xF80000 - 0xFFFFFF
  116. # #############################################################################
  117. .bss
  118. .align 4
  119. # used tables
  120. m_read8_table:
  121. .skip 32*4
  122. m_read16_table:
  123. .skip 32*4
  124. m_read32_table:
  125. .skip 32*4
  126. # #############################################################################
  127. .text
  128. .align 4
  129. .global PicoMemReset
  130. .global PicoRead8
  131. .global PicoRead16
  132. .global PicoRead32
  133. .global PicoWriteRomHW_SSF2
  134. .global m_read8_def_table
  135. .global m_read8_table
  136. .macro PicoMemResetCopyDef dst_table src_table
  137. lui $t0, %hi(\dst_table)
  138. addiu $t0, %lo(\dst_table)
  139. lui $t1, %hi(\src_table)
  140. addiu $t1, %lo(\src_table)
  141. li $t2, 32
  142. 1:
  143. lw $t3, 0($t1)
  144. sw $t3, 0($t0)
  145. addiu $t2, -1
  146. addiu $t1, 4
  147. nop #Workaround for the R5900 short-loop bug.
  148. bnez $t2, 1b
  149. addiu $t0, 4
  150. .endm
  151. # $t4 = 4
  152. .macro PicoMemResetRomArea dst_table ar_label
  153. lui $t0, %hi(\dst_table)
  154. addiu $t0, %lo(\dst_table)
  155. lui $t1, %hi(\ar_label)
  156. addiu $t1, %lo(\ar_label)
  157. li $t2, 20
  158. 1:
  159. beq $t2, $v1, 2f
  160. addiu $t2, -1
  161. sll $t3, $t2, 2
  162. beq $t2, $t4, 1b # do not touch the SRAM area
  163. addu $t3, $t0
  164. j 1b
  165. sw $t1, 0($t3)
  166. 2:
  167. .endm
  168. PicoMemReset:
  169. lui $v1, %hi(Pico+0x22204)
  170. lw $v1, %lo(Pico+0x22204)($v1) # romsize
  171. lui $t0, 8
  172. addu $v1, $t0
  173. addiu $v1, -1
  174. srl $v1, 19
  175. PicoMemResetCopyDef m_read8_table m_read8_def_table
  176. PicoMemResetCopyDef m_read16_table m_read16_def_table
  177. PicoMemResetCopyDef m_read32_table m_read32_def_table
  178. # update memhandlers according to ROM size
  179. li $t4, 4
  180. PicoMemResetRomArea m_read8_table m_read8_above_rom
  181. PicoMemResetRomArea m_read16_table m_read16_above_rom
  182. PicoMemResetRomArea m_read32_table m_read32_above_rom
  183. jr $ra
  184. nop
  185. # #############################################################################
  186. .macro PicoReadJump table
  187. lui $t0, %hi(\table)
  188. srl $t1, $a0, 19
  189. li $at, 0xFFFFFF83
  190. and $t0, $t0, $at
  191. andi $t1, $t1, 0x1F
  192. sll $t1, $t1, 2
  193. or $t0, $t0, $t1
  194. lw $t0, %lo(\table)($t0)
  195. sll $a0, $a0, 8
  196. jr $t0
  197. srl $a0, $a0, 8
  198. .endm
  199. PicoRead8: # u32 a
  200. PicoReadJump m_read8_table
  201. PicoRead16: # u32 a
  202. PicoReadJump m_read16_table
  203. PicoRead32: # u32 a
  204. PicoReadJump m_read32_table
  205. # #############################################################################
  206. m_read_null:
  207. jr $ra
  208. li $v0, 0
  209. m_read_neg1:
  210. jr $ra
  211. addiu $v0, $0, 0xffff
  212. # loads &Pico.rom to $t3
  213. .macro m_read_rom_try_sram is200000 size
  214. lui $t2, %hi(SRam)
  215. addiu $t2, %lo(SRam)
  216. lui $t3, %hi(Pico+0x22200)
  217. lw $t1, 8($t2) # SRam.end
  218. .if \is200000
  219. sll $a0, $a0, 13
  220. srl $a0, $a0, 13
  221. lui $t4, 0x20
  222. or $a0, $t4
  223. .endif
  224. subu $t4, $a0, $t1
  225. bgtz $t4, 1f
  226. addiu $t3, %lo(Pico+0x22200)
  227. lw $t1, 4($t2) # SRam.start
  228. subu $t4, $t1, $a0
  229. bgtz $t4, 1f
  230. nop
  231. lb $t1, 0x11($t3) # Pico.m.sram_reg
  232. andi $t4, $t1, 5
  233. beqz $t4, 1f
  234. nop
  235. .if \size == 8
  236. j SRAMRead
  237. nop
  238. .elseif \size == 16
  239. sd $ra, -16($sp)
  240. jal SRAMRead16
  241. addiu $sp, -16
  242. ld $ra, 0($sp)
  243. jr $ra
  244. addiu $sp, 16
  245. .else
  246. addiu $sp, -32
  247. sd $ra, 0($sp)
  248. sd $a0, 16($sp)
  249. jal SRAMRead16
  250. nop
  251. ld $a0, 16($sp)
  252. sd $v0, 16($sp)
  253. jal SRAMRead16
  254. addiu $a0, 2
  255. ld $v1, 16($sp)
  256. ld $ra, 0($sp)
  257. andi $v0, $v0, 0xFFFF
  258. srl $v1, $v1, 16
  259. or $v0, $v1
  260. jr $ra
  261. addiu $sp, 32
  262. .endif
  263. # m_read_nosram:
  264. 1:
  265. .endm
  266. .macro m_read8_rom sect
  267. lui $t0, %hi(Pico+0x22200)
  268. lw $t0, %lo(Pico+0x22200)($t0) # rom
  269. xori $a0, 1
  270. sll $a0, $a0, 13
  271. srl $a0, $a0, 13
  272. .if \sect
  273. lui $t1, 8*\sect
  274. addu $a0, $t1
  275. .endif
  276. addu $t0, $a0
  277. jr $ra
  278. lb $v0, 0($t0)
  279. .endm
  280. m_read8_rom0: # 0x000000 - 0x07ffff
  281. m_read8_rom 0
  282. m_read8_rom1: # 0x080000 - 0x0fffff
  283. m_read8_rom 1
  284. m_read8_rom2: # 0x100000 - 0x17ffff
  285. m_read8_rom 2
  286. m_read8_rom3: # 0x180000 - 0x1fffff
  287. m_read8_rom 3
  288. m_read8_rom4: # 0x200000 - 0x27ffff, SRAM area
  289. m_read_rom_try_sram 1 8
  290. lw $t1, 4($t3) # romsize
  291. subu $t4, $t1, $a0
  292. blez $t4, m_read_null
  293. lw $t1, 0($t3) # rom
  294. xori $a0, 1
  295. addu $t1, $a0
  296. jr $ra
  297. lb $v0, 0($t1)
  298. m_read8_rom5: # 0x280000 - 0x2fffff
  299. m_read8_rom 5
  300. m_read8_rom6: # 0x300000 - 0x37ffff
  301. m_read8_rom 6
  302. m_read8_rom7: # 0x380000 - 0x3fffff
  303. m_read8_rom 7
  304. m_read8_rom8: # 0x400000 - 0x47ffff
  305. m_read8_rom 8
  306. m_read8_rom9: # 0x480000 - 0x4fffff
  307. m_read8_rom 9
  308. m_read8_romA: # 0x500000 - 0x57ffff
  309. m_read8_rom 0xA
  310. m_read8_romB: # 0x580000 - 0x5fffff
  311. m_read8_rom 0xB
  312. m_read8_romC: # 0x600000 - 0x67ffff
  313. m_read8_rom 0xC
  314. m_read8_romD: # 0x680000 - 0x6fffff
  315. m_read8_rom 0xD
  316. m_read8_romE: # 0x700000 - 0x77ffff
  317. m_read8_rom 0xE
  318. m_read8_romF: # 0x780000 - 0x7fffff
  319. m_read8_rom 0xF
  320. m_read8_rom10: # 0x800000 - 0x87ffff
  321. m_read8_rom 0x10
  322. m_read8_rom11: # 0x880000 - 0x8fffff
  323. m_read8_rom 0x11
  324. m_read8_rom12: # 0x900000 - 0x97ffff
  325. m_read8_rom 0x12
  326. m_read8_rom13: # 0x980000 - 0x9fffff
  327. m_read8_rom 0x13
  328. m_read8_misc:
  329. srl $t0, $a0, 5
  330. sll $t0, $t0, 5
  331. lui $t1, 0xa1
  332. bne $t0, $t1, m_read8_misc2
  333. andi $t0, $a0, 0x1e
  334. m_read8_misc_io:
  335. beqz $t0, m_read8_misc_hwreg
  336. sub $t1, $t0, 4
  337. bgtz $t1, m_read8_misc_ioports
  338. nop
  339. slti $a0, $t0, 4
  340. xori $a0, 1
  341. j PadRead
  342. nop
  343. m_read8_misc_hwreg:
  344. lui $v0, %hi(Pico+0x2220f)
  345. jr $ra
  346. lb $v0, %lo(Pico+0x2220f)($v0)
  347. m_read8_misc_ioports:
  348. lui $v0, %hi(Pico+0x22000)
  349. sra $v0, $v0, 5
  350. sll $v0, $v0, 5
  351. andi $t0, $t0, 0x1F
  352. or $v0, $v0, $t0
  353. jr $ra
  354. lb $v0, %lo(Pico+0x22000)($v0)
  355. m_read8_misc2:
  356. lui $t0, 0xa1
  357. ori $t0, 0x1100
  358. bne $a0, $t0, m_read8_misc3
  359. srl $t0, $a0, 16
  360. j z80ReadBusReq
  361. m_read8_misc3:
  362. addiu $t0, 0xff60 # expecting 0xa0 to get 0
  363. bnez $t0, m_read8_misc4
  364. # z80 area
  365. andi $t0, $a0, 0x4000
  366. bnez $t0, m_read8_z80_misc
  367. andi $t0, $a0, 0x6000
  368. j z80Read8 # z80 RAM
  369. m_read8_z80_misc:
  370. addiu $t0, 0xc000 # expecting 0x4000 to get 0
  371. bnez $t0, m_read_neg1 # invalid
  372. nop
  373. j ym2612_read_local_68k
  374. nop
  375. m_read8_fake_ym2612:
  376. lb $v0, %lo(Pico+0x22208)($t0) # Pico.m.rotate
  377. addiu $t1, $v0, 1
  378. jr $ra
  379. sb $t1, %lo(Pico+0x22208)($t0)
  380. # delay slot friendly
  381. .macro m_read8_call16 funcname is_func_ptr=0
  382. .if \is_func_ptr
  383. lui $t1, %hi(\funcname)
  384. lw $t1, %lo(\funcname)($t1)
  385. .endif
  386. andi $t0, $a0, 1
  387. beqz $t0, 1f
  388. li $a1, 8 # not always needed, but shouln't cause problems
  389. .if \is_func_ptr
  390. jr $t1
  391. .else
  392. j \funcname # odd address
  393. .endif
  394. nop
  395. 1:
  396. addiu $sp, -16
  397. sd $ra, 0($sp)
  398. .if \is_func_ptr
  399. jalr $t1
  400. .else
  401. jal \funcname
  402. .endif
  403. xori $a0, 1
  404. ld $ra, 0($sp)
  405. addiu $sp, 16
  406. jr $ra
  407. srl $v0, 8
  408. .endm
  409. m_read8_misc4:
  410. # if everything else fails, use generic handler
  411. m_read8_call16 OtherRead16
  412. m_read8_vdp:
  413. ext $t0, $a0, 16, 3
  414. andi $t1, $a0, 0xe0
  415. or $t0, $t1
  416. bnez $t0, m_read_null # invalid address
  417. nop
  418. j PicoVideoRead8
  419. nop
  420. m_read8_ram:
  421. lui $t0, %hi(Pico)
  422. andi $a0, $a0, 0xFFFF
  423. sra $t0, $t0, 16
  424. sll $t0, $t0, 16
  425. or $t0, $t0, $a0
  426. xori $t0, 1
  427. jr $ra
  428. lb $v0, %lo(Pico)($t0)
  429. m_read8_above_rom:
  430. # might still be SRam (Micro Machines, HardBall '95)
  431. m_read_rom_try_sram 0 8
  432. m_read8_call16 PicoRead16Hook 1
  433. # #############################################################################
  434. .macro m_read16_rom sect
  435. lui $t0, %hi(Pico+0x22200)
  436. lw $t0, %lo(Pico+0x22200)($t0) # rom
  437. li $at, 0x0007FFFE
  438. and $a0, $a0, $at
  439. .if \sect
  440. lui $t1, 8*\sect
  441. addu $a0, $t1
  442. .endif
  443. addu $t0, $a0
  444. jr $ra
  445. lh $v0, 0($t0)
  446. .endm
  447. m_read16_rom0: # 0x000000 - 0x07ffff
  448. m_read16_rom 0
  449. m_read16_rom1: # 0x080000 - 0x0fffff
  450. m_read16_rom 1
  451. m_read16_rom2: # 0x100000 - 0x17ffff
  452. m_read16_rom 2
  453. m_read16_rom3: # 0x180000 - 0x1fffff
  454. m_read16_rom 3
  455. m_read16_rom4: # 0x200000 - 0x27ffff, SRAM area
  456. m_read_rom_try_sram 1 16
  457. lw $t1, 4($t3) # romsize
  458. subu $t4, $t1, $a0
  459. blez $t4, m_read_null
  460. lw $t1, 0($t3) # rom
  461. sra $a0, $a0, 1
  462. sll $a0, $a0, 1
  463. addu $t1, $a0
  464. jr $ra
  465. lh $v0, 0($t1)
  466. m_read16_rom5: # 0x280000 - 0x2fffff
  467. m_read16_rom 5
  468. m_read16_rom6: # 0x300000 - 0x37ffff
  469. m_read16_rom 6
  470. m_read16_rom7: # 0x380000 - 0x3fffff
  471. m_read16_rom 7
  472. m_read16_rom8: # 0x400000 - 0x47ffff
  473. m_read16_rom 8
  474. m_read16_rom9: # 0x480000 - 0x4fffff
  475. m_read16_rom 9
  476. m_read16_romA: # 0x500000 - 0x57ffff
  477. m_read16_rom 0xA
  478. m_read16_romB: # 0x580000 - 0x5fffff
  479. m_read16_rom 0xB
  480. m_read16_romC: # 0x600000 - 0x67ffff
  481. m_read16_rom 0xC
  482. m_read16_romD: # 0x680000 - 0x6fffff
  483. m_read16_rom 0xD
  484. m_read16_romE: # 0x700000 - 0x77ffff
  485. m_read16_rom 0xE
  486. m_read16_romF: # 0x780000 - 0x7fffff
  487. m_read16_rom 0xF
  488. m_read16_rom10: # 0x800000 - 0x87ffff
  489. m_read16_rom 0x10
  490. m_read16_rom11: # 0x880000 - 0x8fffff
  491. m_read16_rom 0x11
  492. m_read16_rom12: # 0x900000 - 0x97ffff
  493. m_read16_rom 0x12
  494. m_read16_rom13: # 0x980000 - 0x9fffff
  495. m_read16_rom 0x13
  496. m_read16_misc:
  497. sra $a0, $a0, 1
  498. sll $a0, $a0, 1
  499. j OtherRead16
  500. li $a1, 16
  501. m_read16_vdp:
  502. ext $t0, $a0, 16, 3
  503. andi $t1, $a0, 0xe0
  504. or $t0, $t1
  505. bnez $t0, m_read_null # invalid address
  506. sra $a0, $a0, 1
  507. j PicoVideoRead
  508. sll $a0, $a0, 1
  509. m_read16_ram:
  510. lui $t0, %hi(Pico)
  511. srl $a0, $a0, 1
  512. sll $a0, $a0, 17
  513. srl $a0, $a0, 16
  514. sra $t0, $t0, 16
  515. sll $t0, $t0, 16
  516. or $t0, $t0, $a0
  517. jr $ra
  518. lh $v0, %lo(Pico)($t0)
  519. m_read16_above_rom:
  520. # might still be SRam
  521. m_read_rom_try_sram 0 16
  522. lui $t1, %hi(PicoRead16Hook)
  523. lw $t1, %lo(PicoRead16Hook)($t1)
  524. sra $a0, $a0, 1
  525. jr $t1
  526. sll $a0, $a0, 1
  527. # #############################################################################
  528. .macro m_read32_rom sect
  529. lui $t0, %hi(Pico+0x22200)
  530. lw $t0, %lo(Pico+0x22200)($t0) # rom
  531. li $at, 0x0007FFFE
  532. and $a0, $a0, $at
  533. .if \sect
  534. lui $t1, 8*\sect
  535. addu $a0, $t1
  536. .endif
  537. addu $t0, $a0
  538. lh $v1, 0($t0)
  539. lh $v0, 2($t0)
  540. andi $v0, $v0, 0xFFFF
  541. sll $v1, $v1, 16
  542. jr $ra
  543. or $v0, $v0, $v1
  544. .endm
  545. m_read32_rom0: # 0x000000 - 0x07ffff
  546. m_read32_rom 0
  547. m_read32_rom1: # 0x080000 - 0x0fffff
  548. m_read32_rom 1
  549. m_read32_rom2: # 0x100000 - 0x17ffff
  550. m_read32_rom 2
  551. m_read32_rom3: # 0x180000 - 0x1fffff
  552. m_read32_rom 3
  553. m_read32_rom4: # 0x200000 - 0x27ffff, SRAM area
  554. m_read_rom_try_sram 1 32
  555. lw $t1, 4($t3) # romsize
  556. subu $t4, $t1, $a0
  557. blez $t4, m_read_null
  558. lw $t1, 0($t3) # rom
  559. sra $a0, $a0, 1
  560. sll $a0, $a0, 1
  561. addu $t1, $a0
  562. lh $v1, 0($t1)
  563. lh $v0, 2($t1)
  564. andi $v0, $v0, 0xFFFF
  565. sll $v1, $v1, 16
  566. jr $ra
  567. or $v0, $v0, $v1
  568. m_read32_rom5: # 0x280000 - 0x2fffff
  569. m_read32_rom 5
  570. m_read32_rom6: # 0x300000 - 0x37ffff
  571. m_read32_rom 6
  572. m_read32_rom7: # 0x380000 - 0x3fffff
  573. m_read32_rom 7
  574. m_read32_rom8: # 0x400000 - 0x47ffff
  575. m_read32_rom 8
  576. m_read32_rom9: # 0x480000 - 0x4fffff
  577. m_read32_rom 9
  578. m_read32_romA: # 0x500000 - 0x57ffff
  579. m_read32_rom 0xA
  580. m_read32_romB: # 0x580000 - 0x5fffff
  581. m_read32_rom 0xB
  582. m_read32_romC: # 0x600000 - 0x67ffff
  583. m_read32_rom 0xC
  584. m_read32_romD: # 0x680000 - 0x6fffff
  585. m_read32_rom 0xD
  586. m_read32_romE: # 0x700000 - 0x77ffff
  587. m_read32_rom 0xE
  588. m_read32_romF: # 0x780000 - 0x7fffff
  589. m_read32_rom 0xF
  590. m_read32_rom10: # 0x800000 - 0x87ffff
  591. m_read32_rom 0x10
  592. m_read32_rom11: # 0x880000 - 0x8fffff
  593. m_read32_rom 0x11
  594. m_read32_rom12: # 0x900000 - 0x97ffff
  595. m_read32_rom 0x12
  596. m_read32_rom13: # 0x980000 - 0x9fffff
  597. m_read32_rom 0x13
  598. .macro m_read32_call16 func need_a1=0
  599. addiu $sp, -32
  600. sd $ra, 0($sp)
  601. sd $s0, 16($sp)
  602. .if \need_a1
  603. li $a1, 16
  604. .endif
  605. jal \func
  606. move $s0, $a0
  607. addu $a0, $s0, 2
  608. .if \need_a1
  609. li $a1, 16
  610. .endif
  611. jal \func
  612. move $s0, $v0
  613. sll $s0, $s0, 16
  614. andi $v0, $v0, 0xFFFF
  615. or $v0, $v0, $s0
  616. ld $ra, 0($sp)
  617. ld $s0, 16($sp)
  618. jr $ra
  619. addiu $sp, 32
  620. .endm
  621. m_read32_misc:
  622. sra $a0, $a0, 1
  623. sll $a0, $a0, 1
  624. m_read32_call16 OtherRead16, 1
  625. m_read32_vdp:
  626. ext $t0, $a0, 16, 3
  627. andi $t1, $a0, 0xe0
  628. or $t0, $t1
  629. bnez $t0, m_read_null # invalid address
  630. sra $a0, $a0, 1
  631. sll $a0, $a0, 1
  632. m_read32_call16 PicoVideoRead
  633. m_read32_ram:
  634. lui $t0, %hi(Pico)
  635. sra $a0, $a0, 1
  636. sll $a0, $a0, 17
  637. srl $a0, $a0, 16
  638. sra $t0, $t0, 16
  639. sll $t0, $t0, 16
  640. or $t0, $t0, $a0
  641. lh $v1, %lo(Pico)($t0)
  642. lh $v0, %lo(Pico+2)($t0)
  643. andi $v0, $v0, 0xFFFF
  644. sll $v1, $v1, 16
  645. jr $ra
  646. or $v0, $v0, $v1
  647. m_read32_above_rom:
  648. # might still be SRam
  649. m_read_rom_try_sram 0 32
  650. sra $a0, $a0, 1
  651. sll $a0, $a0, 1
  652. lui $t1, %hi(PicoRead16Hook)
  653. lw $t1, %lo(PicoRead16Hook)($t1)
  654. addiu $sp, -16*3
  655. sd $ra, 0($sp)
  656. sd $s0, 16($sp)
  657. sd $t1, 32($sp)
  658. jalr $t1
  659. move $s0, $a0
  660. ld $t1, 32($sp)
  661. addu $a0, $s0, 2
  662. jalr $t1
  663. move $s0, $v0
  664. andi $v0, $v0, 0xFFFF
  665. sll $s0, $s0, 16
  666. or $v0, $v0, $s0
  667. ld $ra, 0($sp)
  668. ld $s0, 16($sp)
  669. jr $ra
  670. addiu $sp, 16*3
  671. # #############################################################################
  672. .macro PicoWriteRomHW_SSF2_ls def_table table
  673. lui $t3, %hi(\def_table)
  674. li $at, 0xFFFFFF83
  675. and $t3, $t3, $at
  676. andi $at, $a1, 0x1F
  677. sll $at, $at, 2
  678. or $t3, $t3, $at
  679. lw $t0, %lo(\def_table)($t3)
  680. lui $t2, %hi(\table)
  681. li $at, 0xFFFFFFE3
  682. and $t2, $t2, $at
  683. andi $at, $a0, 0x07
  684. sll $at, $at, 2
  685. or $t2, $t2, $at
  686. sw $t0, %lo(\table)($t2)
  687. .endm
  688. PicoWriteRomHW_SSF2: # u32 a, u32 d
  689. ext $a0, $a0, 1, 3
  690. bnez $a0, pwr_banking
  691. # sram register
  692. lui $t0, %hi(Pico+0x22211)
  693. lb $t1, %lo(Pico+0x22211)($t0) # Pico.m.sram_reg
  694. sra $t1, $t1, 2
  695. sll $t1, $t1, 2
  696. andi $a1, $a1, 3
  697. or $t1, $t1, $a1
  698. jr $ra
  699. sb $t1, %lo(Pico+0x22211)($t0)
  700. pwr_banking:
  701. andi $a1, 0x1f
  702. PicoWriteRomHW_SSF2_ls m_read8_def_table m_read8_table
  703. PicoWriteRomHW_SSF2_ls m_read16_def_table m_read16_table
  704. PicoWriteRomHW_SSF2_ls m_read32_def_table m_read32_table
  705. jr $ra
  706. nop