memory_arm.S 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. * PicoDrive 32X memory access functions, assembler version
  3. * (C) KUB, 2018
  4. *
  5. * This work is licensed under the terms of MAME license.
  6. * See COPYING file in the top-level directory.
  7. */
  8. #include <pico/pico_int_offs.h>
  9. @ 32X bank sizes... TODO this should somehow come from an include file
  10. .equ SH2_ROM_SHIFT, 10 @ 0x003fffff
  11. .equ SH2_RAM_SHIFT, 14 @ 0x0003ffff
  12. .equ SH2_DRAM_SHIFT,15 @ 0x0001ffff
  13. .equ SH2_DA_SHIFT, 20 @ 0x00000fff
  14. .equ SH2_DRAM_OW, 1<<(32-SH2_DRAM_SHIFT) @ DRAM overwrite mode bit
  15. .text
  16. .align 5
  17. #if 0
  18. @ u32 a, SH2 *sh2
  19. .global sh2_read8_rom
  20. .global sh2_read8_sdram
  21. .global sh2_read8_da
  22. .global sh2_read8_dram
  23. .global sh2_read16_rom
  24. .global sh2_read16_sdram
  25. .global sh2_read16_da
  26. .global sh2_read16_dram
  27. .global sh2_read32_rom
  28. .global sh2_read32_sdram
  29. .global sh2_read32_da
  30. .global sh2_read32_dram
  31. #endif
  32. @ u32 a, u32 d, SH2 *sh2
  33. .global sh2_write8_sdram
  34. .global sh2_write8_da
  35. .global sh2_write8_dram
  36. .global sh2_write16_sdram
  37. .global sh2_write16_da
  38. .global sh2_write16_dram
  39. .global sh2_write32_sdram
  40. .global sh2_write32_da
  41. .global sh2_write32_dram
  42. #if 0
  43. sh2_read8_rom:
  44. ldr ip, [r1, #OFS_SH2_p_rom]
  45. eor r0, r0, #1
  46. mov r0, r0, lsl #SH2_ROM_SHIFT
  47. ldrb r0, [ip, r0, lsr #SH2_ROM_SHIFT]
  48. bx lr
  49. sh2_read8_sdram:
  50. ldr ip, [r1, #OFS_SH2_p_sdram]
  51. eor r0, r0, #1
  52. mov r0, r0, lsl #SH2_RAM_SHIFT
  53. ldrb r0, [ip, r0, lsr #SH2_RAM_SHIFT]
  54. bx lr
  55. sh2_read8_da:
  56. ldr ip, [r1, #OFS_SH2_p_da]
  57. eor r0, r0, #1
  58. mov r0, r0, lsl #SH2_DA_SHIFT
  59. ldrb r0, [ip, r0, lsr #SH2_DA_SHIFT]
  60. bx lr
  61. sh2_read8_dram:
  62. ldr ip, [r1, #OFS_SH2_p_dram]
  63. eor r0, r0, #1
  64. mov r0, r0, lsl #SH2_DRAM_SHIFT
  65. ldrb r0, [ip, r0, lsr #SH2_DRAM_SHIFT]
  66. bx lr
  67. sh2_read16_rom:
  68. ldr ip, [r1, #OFS_SH2_p_rom]
  69. mov r0, r0, lsl #SH2_ROM_SHIFT
  70. mov r0, r0, lsr #SH2_ROM_SHIFT
  71. ldrh r0, [ip, r0]
  72. bx lr
  73. sh2_read16_sdram:
  74. ldr ip, [r1, #OFS_SH2_p_sdram]
  75. mov r0, r0, lsl #SH2_RAM_SHIFT
  76. mov r0, r0, lsr #SH2_RAM_SHIFT
  77. ldrh r0, [ip, r0]
  78. bx lr
  79. sh2_read16_da:
  80. ldr ip, [r1, #OFS_SH2_p_da]
  81. mov r0, r0, lsl #SH2_DA_SHIFT
  82. mov r0, r0, lsr #SH2_DA_SHIFT
  83. ldrh r0, [ip, r0]
  84. bx lr
  85. sh2_read16_dram:
  86. ldr ip, [r1, #OFS_SH2_p_dram]
  87. mov r0, r0, lsl #SH2_DRAM_SHIFT
  88. mov r0, r0, lsr #SH2_DRAM_SHIFT
  89. ldrh r0, [ip, r0]
  90. bx lr
  91. sh2_read32_rom:
  92. ldr ip, [r1, #OFS_SH2_p_rom]
  93. mov r0, r0, lsl #SH2_ROM_SHIFT
  94. ldr r0, [ip, r0, lsr #SH2_ROM_SHIFT]
  95. mov r0, r0, ror #16
  96. bx lr
  97. sh2_read32_sdram:
  98. ldr ip, [r1, #OFS_SH2_p_sdram]
  99. mov r0, r0, lsl #SH2_RAM_SHIFT
  100. ldr r0, [ip, r0, lsr #SH2_RAM_SHIFT]
  101. mov r0, r0, ror #16
  102. bx lr
  103. sh2_read32_da:
  104. ldr ip, [r1, #OFS_SH2_p_da]
  105. mov r0, r0, lsl #SH2_DA_SHIFT
  106. ldr r0, [ip, r0, lsr #SH2_DA_SHIFT]
  107. mov r0, r0, ror #16
  108. bx lr
  109. sh2_read32_dram:
  110. ldr ip, [r1, #OFS_SH2_p_dram]
  111. mov r0, r0, lsl #SH2_DRAM_SHIFT
  112. ldr r0, [ip, r0, lsr #SH2_DRAM_SHIFT]
  113. mov r0, r0, ror #16
  114. bx lr
  115. #endif
  116. sh2_write8_sdram:
  117. @ preserve r0-r2 for tail call
  118. ldr ip, [r2, #OFS_SH2_p_sdram]
  119. eor r3, r0, #1
  120. mov r3, r3, lsl #SH2_RAM_SHIFT
  121. strb r1, [ip, r3, lsr #SH2_RAM_SHIFT]
  122. #ifdef DRC_SH2
  123. ldr r1, [r2, #OFS_SH2_p_drcblk_ram]
  124. ldrb r3, [r1, r3, lsr #SH2_RAM_SHIFT+1]
  125. cmp r3, #0
  126. bxeq lr
  127. @ need to load aligned 16 bit data for check
  128. bic r0, r0, #1
  129. mov r1, r0, lsl #SH2_RAM_SHIFT
  130. mov r1, r1, lsr #SH2_RAM_SHIFT
  131. ldrh r1, [ip, r1]
  132. b sh2_sdram_checks
  133. #else
  134. bx lr
  135. #endif
  136. sh2_write8_da:
  137. @ preserve r0 and r2 for tail call
  138. ldr ip, [r2, #OFS_SH2_p_da]
  139. eor r3, r0, #1
  140. mov r3, r3, lsl #SH2_DA_SHIFT
  141. strb r1, [ip, r3, lsr #SH2_DA_SHIFT]
  142. #ifdef DRC_SH2
  143. ldr ip, [r2, #OFS_SH2_p_drcblk_da]
  144. ldrb r1, [ip, r3, lsr #SH2_DA_SHIFT+1]
  145. bic r0, r0, #1
  146. cmp r1, #0
  147. bxeq lr
  148. mov r1, #2
  149. b sh2_drc_wcheck_da
  150. #else
  151. bx lr
  152. #endif
  153. sh2_write8_dram:
  154. tst r1, #0xff
  155. ldrne ip, [r2, #OFS_SH2_p_dram]
  156. eorne r3, r0, #1
  157. movne r3, r3, lsl #SH2_DRAM_SHIFT
  158. strneb r1, [ip, r3, lsr #SH2_DRAM_SHIFT]
  159. bx lr
  160. sh2_write16_sdram:
  161. @ preserve r0-r2 for tail call
  162. ldr ip, [r2, #OFS_SH2_p_sdram]
  163. mov r3, r0, lsl #SH2_RAM_SHIFT
  164. mov r3, r3, lsr #SH2_RAM_SHIFT
  165. strh r1, [ip, r3]
  166. #ifdef DRC_SH2
  167. ldr ip, [r2, #OFS_SH2_p_drcblk_ram]
  168. ldrb r3, [ip, r3, lsr #1]
  169. cmp r3, #0
  170. bxeq lr
  171. b sh2_sdram_checks
  172. #else
  173. bx lr
  174. #endif
  175. sh2_write16_da:
  176. @ preserve r0 and r2 for tail call
  177. ldr ip, [r2, #OFS_SH2_p_da]
  178. mov r3, r0, lsl #SH2_DA_SHIFT
  179. mov r3, r3, lsr #SH2_DA_SHIFT
  180. strh r1, [ip, r3]
  181. #ifdef DRC_SH2
  182. ldr ip, [r2, #OFS_SH2_p_drcblk_da]
  183. ldrb r1, [ip, r3, lsr #1]
  184. cmp r1, #0
  185. bxeq lr
  186. mov r1, #2
  187. b sh2_drc_wcheck_da
  188. #else
  189. bx lr
  190. #endif
  191. sh2_write16_dram:
  192. ldr ip, [r2, #OFS_SH2_p_dram]
  193. tst r0, #SH2_DRAM_OW
  194. mov r3, r0, lsl #SH2_DRAM_SHIFT
  195. mov r3, r3, lsr #SH2_DRAM_SHIFT
  196. streqh r1, [ip, r3]
  197. bxeq lr
  198. add ip, ip, r3
  199. tst r1, #0xff
  200. strneb r1, [ip, #0]
  201. tst r1, #0xff00
  202. movne r1, r1, lsr #8
  203. strneb r1, [ip, #1]
  204. bx lr
  205. sh2_write32_sdram:
  206. @ preserve r0-r2 for tail call
  207. ldr ip, [r2, #OFS_SH2_p_sdram]
  208. mov r1, r1, ror #16
  209. mov r3, r0, lsl #SH2_RAM_SHIFT
  210. str r1, [ip, r3, lsr #SH2_RAM_SHIFT]
  211. #ifdef DRC_SH2
  212. ldr ip, [r2, #OFS_SH2_p_drcblk_ram]
  213. ldrb r3, [ip, r3, lsr #SH2_RAM_SHIFT+1]!
  214. ldrb ip, [ip, #1]
  215. orrs r3, r3, ip, lsl #16
  216. bxeq lr
  217. mov r1, r1, ror #16
  218. b sh2_sdram_checks_l
  219. #else
  220. bx lr
  221. #endif
  222. sh2_write32_da:
  223. @ preserve r0 and r2 for tail call
  224. ldr ip, [r2, #OFS_SH2_p_da]
  225. mov r1, r1, ror #16
  226. mov r3, r0, lsl #SH2_DA_SHIFT
  227. str r1, [ip, r3, lsr #SH2_DA_SHIFT]
  228. #ifdef DRC_SH2
  229. ldr ip, [r2, #OFS_SH2_p_drcblk_da]
  230. ldrb r1, [ip, r3, lsr #SH2_DA_SHIFT+1]!
  231. ldrb ip, [ip, #1]
  232. orrs r1, r1, ip, lsl #16
  233. bxeq lr
  234. mov r1, #4
  235. b sh2_drc_wcheck_da
  236. #else
  237. bx lr
  238. #endif
  239. sh2_write32_dram:
  240. ldr ip, [r2, #OFS_SH2_p_dram]
  241. tst r0, #SH2_DRAM_OW
  242. mov r3, r0, lsl #SH2_DRAM_SHIFT
  243. mov r1, r1, ror #16
  244. streq r1, [ip, r3, lsr #SH2_DRAM_SHIFT]
  245. bxeq lr
  246. ldr r0, [ip, r3, lsr #SH2_DRAM_SHIFT]
  247. tst r1, #0x00ff0000
  248. bicne r0, r0, #0x00ff0000
  249. tst r1, #0xff000000
  250. bicne r0, r0, #0xff000000
  251. tst r1, #0x000000ff
  252. bicne r0, r0, #0x000000ff
  253. tst r1, #0x0000ff00
  254. bicne r0, r0, #0x0000ff00
  255. orr r0, r0, r1
  256. str r0, [ip, r3, lsr #SH2_DRAM_SHIFT]
  257. bx lr
  258. .pool
  259. @ vim:filetype=armasm