memory_amips.S 19 KB

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