memory_arm.S 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * PicoDrive
  3. * (C) notaz, 2006-2009
  4. * (C) kub, 2019
  5. *
  6. * This work is licensed under the terms of MAME license.
  7. * See COPYING file in the top-level directory.
  8. */
  9. #include "pico_int_offs.h"
  10. .equ SRR_MAPPED, (1 << 0)
  11. .equ SRR_READONLY, (1 << 1)
  12. .equ SRF_EEPROM, (1 << 1)
  13. .equ POPT_EN_32X, (1 << 20)
  14. .text
  15. .align 4
  16. .global PicoRead8_sram
  17. .global PicoRead8_io
  18. .global PicoRead16_sram
  19. .global PicoRead16_io
  20. .global PicoWrite8_io
  21. .global PicoWrite16_io
  22. PicoRead8_sram: @ u32 a
  23. ldr r3, =Pico
  24. ldr r1, [r3, #OFS_Pico_sv_end]
  25. cmp r0, r1
  26. bgt m_read8_nosram
  27. ldr r2, [r3, #OFS_Pico_sv_start]
  28. cmp r0, r2
  29. blt m_read8_nosram
  30. ldrb r1, [r3, #OFS_Pico_m_sram_reg]
  31. tst r1, #SRR_MAPPED
  32. beq m_read8_nosram
  33. ldr r1, [r3, #OFS_Pico_sv_flags]
  34. tst r1, #SRF_EEPROM
  35. bne m_read8_eeprom
  36. ldr r1, [r3, #OFS_Pico_sv_data]
  37. sub r0, r0, r2
  38. ldrb r0, [r0, r1]
  39. bx lr
  40. m_read8_nosram:
  41. ldr r1, [r3, #OFS_Pico_romsize]
  42. cmp r0, r1
  43. movgt r0, #0
  44. bxgt lr @ bad location
  45. @ XXX: banking unfriendly
  46. ldr r1, [r3, #OFS_Pico_rom]
  47. eor r0, r0, #1
  48. ldrb r0, [r1, r0]
  49. bx lr
  50. m_read8_eeprom:
  51. stmfd sp!,{r0,lr}
  52. bl EEPROM_read
  53. ldmfd sp!,{r1,lr}
  54. tst r1, #1
  55. moveq r0, r0, lsr #8
  56. and r0, r0, #0xff
  57. bx lr
  58. PicoRead8_io: @ u32 a
  59. bic r2, r0, #0x001f @ most commonly we get i/o port read,
  60. cmp r2, #0xa10000 @ so check for it first
  61. beq io_ports_read
  62. m_read8_not_io:
  63. and r2, r0, #0xfc00
  64. cmp r2, #0x1000
  65. bne PicoRead8_32x
  66. ldr r3, =Pico
  67. mov r1, r0
  68. ldr r0, [r3, #OFS_Pico_m_rotate]
  69. add r0, r0, #1
  70. strb r0, [r3, #OFS_Pico_m_rotate]
  71. eor r0, r0, r0, lsl #6
  72. tst r1, #1
  73. bxne lr @ odd addr -> open bus
  74. bic r0, r0, #1 @ bit0 defined in this area
  75. and r2, r1, #0xff00
  76. cmp r2, #0x1100
  77. bxne lr @ not busreq
  78. ldrb r1, [r3, #OFS_Pico_m_z80Run]
  79. ldrb r2, [r3, #OFS_Pico_m_z80_reset]
  80. orr r0, r0, r1
  81. orr r0, r0, r2
  82. bx lr
  83. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  84. PicoRead16_sram: @ u32 a, u32 d
  85. ldr r3, =Pico
  86. ldr r1, [r3, #OFS_Pico_sv_end]
  87. cmp r0, r1
  88. bgt m_read16_nosram
  89. ldr r2, [r3, #OFS_Pico_sv_start]
  90. cmp r0, r2
  91. blt m_read16_nosram
  92. ldrb r1, [r3, #OFS_Pico_m_sram_reg]
  93. tst r1, #SRR_MAPPED
  94. beq m_read16_nosram
  95. ldr r1, [r3, #OFS_Pico_sv_flags]
  96. tst r1, #SRF_EEPROM
  97. bne EEPROM_read
  98. ldr r1, [r3, #OFS_Pico_sv_data]
  99. sub r0, r0, r2
  100. ldrb r1, [r0, r1]!
  101. ldrb r0, [r0, #1]
  102. orr r0, r0, r1, lsl #8
  103. bx lr
  104. m_read16_nosram:
  105. ldr r1, [r3, #OFS_Pico_romsize]
  106. cmp r0, r1
  107. movgt r0, #0
  108. bxgt lr @ bad location
  109. @ XXX: banking unfriendly
  110. ldr r1, [r3, #OFS_Pico_rom]
  111. ldrh r0, [r1, r0]
  112. bx lr
  113. PicoRead16_io: @ u32 a, u32 d
  114. bic r2, r0, #0x001f @ most commonly we get i/o port read,
  115. cmp r2, #0xa10000 @ so check for it first
  116. bne m_read16_not_io
  117. stmfd sp!,{lr}
  118. bl io_ports_read @ same as read8
  119. orr r0, r0, r0, lsl #8 @ only has bytes mirrored
  120. ldmfd sp!,{pc}
  121. m_read16_not_io:
  122. and r2, r0, #0xfc00
  123. cmp r2, #0x1000
  124. bne PicoRead16_32x
  125. ldr r3, =Pico
  126. and r2, r0, #0xff00
  127. ldr r0, [r3, #OFS_Pico_m_rotate]
  128. add r0, r0, #1
  129. strb r0, [r3, #OFS_Pico_m_rotate]
  130. eor r0, r0, r0, lsl #5
  131. eor r0, r0, r0, lsl #8
  132. bic r0, r0, #0x100 @ bit8 defined in this area
  133. cmp r2, #0x1100
  134. bxne lr @ not busreq
  135. ldrb r1, [r3, #OFS_Pico_m_z80Run]
  136. ldrb r2, [r3, #OFS_Pico_m_z80_reset]
  137. orr r0, r0, r1, lsl #8
  138. orr r0, r0, r2, lsl #8
  139. bx lr
  140. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  141. PicoWrite8_io: @ u32 a, u32 d
  142. bic r2, r0, #0x1e @ most commonly we get i/o port write,
  143. eor r2, r2, #0xa10000 @ so check for it first
  144. eors r2, r2, #1
  145. beq io_ports_write
  146. m_write8_not_io:
  147. tst r0, #1
  148. bne m_write8_not_z80ctl @ even addrs only
  149. and r2, r0, #0xff00
  150. cmp r2, #0x1100
  151. moveq r0, r1
  152. beq ctl_write_z80busreq
  153. cmp r2, #0x1200
  154. moveq r0, r1
  155. beq ctl_write_z80reset
  156. m_write8_not_z80ctl:
  157. @ unlikely
  158. eor r2, r0, #0xa10000
  159. eor r2, r2, #0x003000
  160. eors r2, r2, #0x0000f1
  161. bne PicoWrite8_32x
  162. ldr r3, =Pico
  163. ldrb r2, [r3, #OFS_Pico_m_sram_reg]
  164. and r1, r1, #(SRR_MAPPED|SRR_READONLY)
  165. bic r2, r2, #(SRR_MAPPED|SRR_READONLY)
  166. orr r2, r2, r1
  167. strb r2, [r3, #OFS_Pico_m_sram_reg]
  168. bx lr
  169. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  170. PicoWrite16_io: @ u32 a, u32 d
  171. bic r2, r0, #0x1f @ most commonly we get i/o port write,
  172. cmp r2, #0xa10000 @ so check for it first
  173. beq io_ports_write
  174. m_write16_not_io:
  175. and r2, r0, #0xff00
  176. cmp r2, #0x1100
  177. moveq r0, r1, lsr #8
  178. beq ctl_write_z80busreq
  179. cmp r2, #0x1200
  180. moveq r0, r1, lsr #8
  181. beq ctl_write_z80reset
  182. m_write16_not_z80ctl:
  183. @ unlikely
  184. eor r2, r0, #0xa10000
  185. eor r2, r2, #0x003000
  186. eors r2, r2, #0x0000f0
  187. bne PicoWrite16_32x
  188. ldr r3, =Pico
  189. ldrb r2, [r3, #OFS_Pico_m_sram_reg]
  190. and r1, r1, #(SRR_MAPPED|SRR_READONLY)
  191. bic r2, r2, #(SRR_MAPPED|SRR_READONLY)
  192. orr r2, r2, r1
  193. strb r2, [r3, #OFS_Pico_m_sram_reg]
  194. bx lr
  195. .global m68k_read8
  196. .global m68k_read16
  197. .global m68k_write8
  198. .global m68k_write16
  199. m68k_read8:
  200. ldr r3, =m68k_read8_map
  201. bic r0, r0, #0xff000000
  202. mov r2, r0, lsr #16
  203. ldr r3, [r3, r2, lsl #2]
  204. eor r2, r0, #1
  205. movs r3, r3, lsl #1
  206. ldrccb r0, [r3, r2]
  207. bxcc lr
  208. bx r3
  209. m68k_read16:
  210. ldr r3, =m68k_read16_map
  211. bic r0, r0, #0xff000000
  212. mov r2, r0, lsr #16
  213. ldr r3, [r3, r2, lsl #2]
  214. bic r0, r0, #1
  215. movs r3, r3, lsl #1
  216. ldrcch r0, [r3, r0]
  217. bxcc lr
  218. bx r3
  219. m68k_read32:
  220. ldr r3, =m68k_read16_map
  221. bic r0, r0, #0xff000000
  222. mov r2, r0, lsr #16
  223. ldr r3, [r3, r2, lsl #2]
  224. bic r0, r0, #1
  225. movs r3, r3, lsl #1
  226. ldrcch r1, [r3, r0]!
  227. ldrcch r0, [r3, #2]
  228. orrcc r0, r0, r1, lsl #16
  229. bxcc lr
  230. stmfd sp!, {r0, r3, r4, lr}
  231. mov lr, pc
  232. bx r3
  233. ldmfd sp!, {r1, r3}
  234. str r0, [sp]
  235. add r0, r1, #2
  236. mov lr, pc
  237. bx r3
  238. ldmfd sp!, {r1, lr}
  239. mov r0, r0, lsl #16
  240. mov r1, r1, lsl #16
  241. orr r0, r1, r0, lsr #16
  242. bx lr
  243. m68k_write8:
  244. ldr r3, =m68k_write8_map
  245. bic r0, r0, #0xff000000
  246. mov r2, r0, lsr #16
  247. ldr r3, [r3, r2, lsl #2]
  248. eor r2, r0, #1
  249. movs r3, r3, lsl #1
  250. strccb r1, [r3, r2]
  251. bxcc lr
  252. bx r3
  253. m68k_write16:
  254. ldr r3, =m68k_write16_map
  255. bic r0, r0, #0xff000000
  256. mov r2, r0, lsr #16
  257. ldr r3, [r3, r2, lsl #2]
  258. bic r0, r0, #1
  259. movs r3, r3, lsl #1
  260. strcch r1, [r3, r0]
  261. bxcc lr
  262. bx r3
  263. m68k_write32:
  264. ldr r3, =m68k_write16_map
  265. bic r0, r0, #0xff000000
  266. mov r2, r0, lsr #16
  267. ldr r3, [r3, r2, lsl #2]
  268. bic r0, r0, #1
  269. movs r3, r3, lsl #1
  270. movcc r2, r1, lsr #16
  271. strcch r2, [r3, r0]!
  272. strcch r1, [r3, #2]
  273. bxcc lr
  274. stmfd sp!, {r0, r1, r3, lr}
  275. mov r1, r1, lsr #16
  276. mov lr, pc
  277. bx r3
  278. ldmfd sp!, {r0, r1, r3, lr}
  279. add r0, r0, #2
  280. bx r3
  281. .pool
  282. @ vim:filetype=armasm