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