memory_arm.S 8.3 KB

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