Memory_amips.s 19 KB

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