memory_arm.S 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  1. @*
  2. @* Memory I/O handlers for Sega/Mega CD emulation
  3. @* (C) notaz, 2007-2009
  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/arm_features.h>
  9. #include <pico/pico_int_offs.h>
  10. .equiv PCM_STEP_SHIFT, 11
  11. .text
  12. .align 2
  13. .global PicoRead8_mcd_io
  14. .global PicoRead16_mcd_io
  15. .global PicoWrite8_mcd_io
  16. .global PicoWrite16_mcd_io
  17. .global PicoReadS68k8_pr
  18. .global PicoReadS68k16_pr
  19. .global PicoWriteS68k8_pr
  20. .global PicoWriteS68k16_pr
  21. .global PicoReadM68k8_cell0
  22. .global PicoReadM68k8_cell1
  23. .global PicoReadM68k16_cell0
  24. .global PicoReadM68k16_cell1
  25. .global PicoWriteM68k8_cell0
  26. .global PicoWriteM68k8_cell1
  27. .global PicoWriteM68k16_cell0
  28. .global PicoWriteM68k16_cell1
  29. .global PicoReadS68k8_dec0
  30. .global PicoReadS68k8_dec1
  31. .global PicoReadS68k16_dec0
  32. .global PicoReadS68k16_dec1
  33. .global PicoWriteS68k8_dec_m0b0
  34. .global PicoWriteS68k8_dec_m1b0
  35. .global PicoWriteS68k8_dec_m2b0
  36. .global PicoWriteS68k8_dec_m0b1
  37. .global PicoWriteS68k8_dec_m1b1
  38. .global PicoWriteS68k8_dec_m2b1
  39. .global PicoWriteS68k16_dec_m0b0
  40. .global PicoWriteS68k16_dec_m1b0
  41. .global PicoWriteS68k16_dec_m2b0
  42. .global PicoWriteS68k16_dec_m0b1
  43. .global PicoWriteS68k16_dec_m1b1
  44. .global PicoWriteS68k16_dec_m2b1
  45. @ externs, just for reference
  46. .extern Pico
  47. .extern cdc_host_r
  48. .extern m68k_reg_write8
  49. .extern s68k_reg_read16
  50. .extern s68k_reg_write8
  51. .extern s68k_reg_write16
  52. .extern s68k_poll_detect
  53. .extern pcd_pcm_write
  54. .extern pcd_pcm_read
  55. .extern PicoRead8_io
  56. .extern PicoRead16_io
  57. .extern PicoWrite8_io
  58. .extern PicoWrite16_io
  59. .extern m68k_comm_check
  60. PIC_LDR_INIT()
  61. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  62. @ utilities
  63. @ r0=addr[in,out], r1,r2=tmp
  64. .macro cell_map
  65. ands r1, r0, #0x01c000
  66. PIC_XB(ne ,r1, lsr #12)
  67. b 0f @ most common?
  68. PIC_BT(0f)
  69. PIC_BT(0f)
  70. PIC_BT(0f)
  71. PIC_BT(0f)
  72. PIC_BT(1f)
  73. PIC_BT(1f)
  74. PIC_BT(2f)
  75. PIC_BT(3f)
  76. 1: @ x16 cells
  77. and r1, r0, #0x7e00 @ col
  78. and r2, r0, #0x01fc @ row
  79. orr r2, r2, #0x0400
  80. orr r1, r2, r1, ror #13
  81. b 9f
  82. 2: @ x8 cells
  83. and r1, r0, #0x3f00 @ col
  84. and r2, r0, #0x00fc @ row
  85. orr r2, r2, #0x0600
  86. orr r1, r2, r1, ror #12
  87. b 9f
  88. 3: @ x4 cells
  89. and r1, r0, #0x1f80 @ col
  90. and r2, r0, #0x007c @ row
  91. orr r1, r2, r1, ror #11
  92. and r2, r0,#0x1e000
  93. orr r1, r1, r2, lsr #6
  94. b 9f
  95. 0: @ x32 cells
  96. and r1, r0, #0xfc00 @ col
  97. and r2, r0, #0x03fc @ row
  98. orr r1, r2, r1, ror #14
  99. 9:
  100. and r0, r0, #3
  101. orr r0, r0, r1, ror #26 @ rol 4+2
  102. .endm
  103. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  104. m_read_null:
  105. mov r0, #0
  106. bx lr
  107. PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
  108. mov r3, #0x0c0000
  109. b 0f
  110. PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
  111. mov r3, #0x0e0000
  112. 0:
  113. cell_map
  114. PIC_LDR(r1, r2, Pico)
  115. add r0, r0, r3
  116. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
  117. eor r0, r0, #1
  118. ldrb r0, [r1, r0]
  119. bx lr
  120. PicoRead8_mcd_io:
  121. and r1, r0, #0xff00
  122. cmp r1, #0x2000 @ a120xx?
  123. bne PicoRead8_io
  124. PIC_LDR(r1, r2, Pico)
  125. and r0, r0, #0x3f
  126. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
  127. cmp r0, #0x0e
  128. PIC_XB(lt ,r0, lsl #2)
  129. b m_m68k_read8_hi
  130. PIC_BT(m_m68k_read8_r00)
  131. PIC_BT(m_m68k_read8_r01)
  132. PIC_BT(m_m68k_read8_r02)
  133. PIC_BT(m_m68k_read8_r03)
  134. PIC_BT(m_m68k_read8_r04)
  135. PIC_BT(m_read_null) @ unused bits
  136. PIC_BT(m_m68k_read8_r06)
  137. PIC_BT(m_m68k_read8_r07)
  138. PIC_BT(m_m68k_read8_r08)
  139. PIC_BT(m_m68k_read8_r09)
  140. PIC_BT(m_read_null) @ reserved
  141. PIC_BT(m_read_null)
  142. PIC_BT(m_m68k_read8_r0c)
  143. PIC_BT(m_m68k_read8_r0d)
  144. m_m68k_read8_r00:
  145. add r1, r1, #0x110000
  146. ldr r0, [r1, #0x30]
  147. and r0, r0, #0x04000000 @ we need irq2 mask state
  148. mov r0, r0, lsr #19
  149. bx lr
  150. m_m68k_read8_r01:
  151. add r1, r1, #0x110000
  152. add r1, r1, #0x002200
  153. ldrb r0, [r1, #2] @ Pico_mcd->m.busreq
  154. bx lr
  155. m_m68k_read8_r02:
  156. add r1, r1, #0x110000
  157. ldrb r0, [r1, #2]
  158. bx lr
  159. m_m68k_read8_r03:
  160. add r1, r1, #0x110000
  161. stmfd sp!, {r1, lr}
  162. bl m68k_comm_check
  163. ldmfd sp!, {r1, lr}
  164. ldrb r0, [r1, #3]
  165. and r0, r0, #0xc7
  166. bx lr
  167. m_m68k_read8_r04:
  168. add r1, r1, #0x110000
  169. ldrb r0, [r1, #4]
  170. bx lr
  171. m_m68k_read8_r06:
  172. ldrb r0, [r1, #0x73] @ IRQ vector
  173. bx lr
  174. m_m68k_read8_r07:
  175. ldrb r0, [r1, #0x72]
  176. bx lr
  177. m_m68k_read8_r08:
  178. mov r0, #0
  179. bl cdc_host_r
  180. mov r0, r0, lsr #8
  181. bx lr
  182. m_m68k_read8_r09:
  183. mov r0, #0
  184. b cdc_host_r
  185. m_m68k_read8_r0c:
  186. add r1, r1, #0x110000
  187. add r1, r1, #0x002200
  188. ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch
  189. mov r0, r0, lsr #24
  190. bx lr
  191. m_m68k_read8_r0d:
  192. add r1, r1, #0x110000
  193. add r1, r1, #0x002200
  194. ldr r0, [r1, #0x14]
  195. mov r0, r0, lsr #16
  196. bx lr
  197. m_m68k_read8_hi:
  198. cmp r0, #0x30
  199. add r1, r1, #0x110000
  200. movge r0, #0
  201. bxge lr
  202. add r1, r1, r0
  203. stmfd sp!, {r1, lr}
  204. bl m68k_comm_check
  205. ldmfd sp!, {r1, lr}
  206. ldrb r0, [r1]
  207. bx lr
  208. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  209. PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
  210. mov r3, #0x0c0000
  211. b 0f
  212. PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
  213. mov r3, #0x0e0000
  214. 0:
  215. cell_map
  216. PIC_LDR(r1, r2, Pico)
  217. add r0, r0, r3
  218. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
  219. bic r0, r0, #1
  220. ldrh r0, [r1, r0]
  221. bx lr
  222. PicoRead16_mcd_io:
  223. and r1, r0, #0xff00
  224. cmp r1, #0x2000 @ a120xx
  225. bne PicoRead16_io
  226. m_m68k_read16_m68k_regs:
  227. PIC_LDR(r1, r2, Pico)
  228. and r0, r0, #0x3e
  229. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
  230. cmp r0, #0x0e
  231. PIC_XB(lt ,r0, lsl #1)
  232. b m_m68k_read16_hi
  233. PIC_BT(m_m68k_read16_r00)
  234. PIC_BT(m_m68k_read16_r02)
  235. PIC_BT(m_m68k_read16_r04)
  236. PIC_BT(m_m68k_read16_r06)
  237. PIC_BT(m_m68k_read16_r08)
  238. PIC_BT(m_read_null) @ reserved
  239. PIC_BT(m_m68k_read16_r0c)
  240. m_m68k_read16_r00:
  241. add r1, r1, #0x110000
  242. ldr r0, [r1, #0x30]
  243. add r1, r1, #0x002200
  244. ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
  245. and r0, r0, #0x04000000 @ we need irq2 mask state
  246. orr r0, r1, r0, lsr #11
  247. bx lr
  248. m_m68k_read16_r02:
  249. add r1, r1, #0x110000
  250. stmfd sp!, {r1, lr}
  251. bl m68k_comm_check
  252. ldmfd sp!, {r1, lr}
  253. ldrb r2, [r1, #3]
  254. ldrb r0, [r1, #2]
  255. and r2, r2, #0xc7
  256. orr r0, r2, r0, lsl #8
  257. bx lr
  258. m_m68k_read16_r04:
  259. add r1, r1, #0x110000
  260. ldrb r0, [r1, #4]
  261. mov r0, r0, lsl #8
  262. bx lr
  263. m_m68k_read16_r06:
  264. ldrh r0, [r1, #0x72] @ IRQ vector
  265. bx lr
  266. m_m68k_read16_r08:
  267. mov r0, #0
  268. b cdc_host_r
  269. m_m68k_read16_r0c:
  270. add r1, r1, #0x110000
  271. add r1, r1, #0x002200
  272. ldr r0, [r1, #0x14]
  273. mov r0, r0, lsr #16
  274. bx lr
  275. m_m68k_read16_hi:
  276. cmp r0, #0x30
  277. add r1, r1, #0x110000
  278. movge r0, #0
  279. bxge lr
  280. add r1, r0, r1
  281. stmfd sp!, {r1, lr}
  282. bl m68k_comm_check
  283. ldmfd sp!, {r0, lr}
  284. ldrh r0, [r0]
  285. mov r1, r0, lsr #8
  286. and r0, r0, #0xff
  287. orr r0, r1, r0, lsl #8
  288. bx lr
  289. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  290. PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
  291. mov r12,#0x0c0000
  292. b 0f
  293. PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
  294. mov r12,#0x0e0000
  295. 0:
  296. mov r3, r1
  297. cell_map
  298. PIC_LDR(r2, r1, Pico)
  299. add r0, r0, r12
  300. ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
  301. ldr r2, [r2]
  302. eor r0, r0, #1
  303. strb r3, [r2, r0]
  304. bx lr
  305. PicoWrite8_mcd_io:
  306. and r2, r0, #0xff00
  307. cmp r2, #0x2000 @ a120xx?
  308. beq m68k_reg_write8
  309. b PicoWrite8_io
  310. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  311. PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
  312. mov r12, #0x0c0000
  313. b 0f
  314. PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
  315. mov r12, #0x0e0000
  316. 0:
  317. mov r3, r1
  318. cell_map
  319. PIC_LDR(r1, r2, Pico)
  320. add r0, r0, r12
  321. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
  322. bic r0, r0, #1
  323. strh r3, [r1, r0]
  324. bx lr
  325. PicoWrite16_mcd_io:
  326. and r2, r0, #0xff00
  327. cmp r2, #0x2000 @ a120xx?
  328. bne PicoWrite16_io
  329. m_m68k_write16_regs:
  330. and r0, r0, #0x3e
  331. cmp r0, #0x0e
  332. beq m_m68k_write16_regs_spec
  333. and r3, r1, #0xff
  334. add r2, r0, #1
  335. stmfd sp!,{r2,r3,lr}
  336. mov r1, r1, lsr #8
  337. bl m68k_reg_write8
  338. ldmfd sp!,{r0,r1,lr}
  339. b m68k_reg_write8
  340. m_m68k_write16_regs_spec: @ special case
  341. mov r1, r1, lsr #8
  342. b m68k_reg_write8
  343. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  344. @ Sub 68k
  345. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  346. PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
  347. mov r3, #0x080000 @ + ^ / 2
  348. b 0f
  349. PicoReadS68k8_dec1:
  350. mov r3, #0x0a0000 @ + ^ / 2
  351. 0:
  352. PIC_LDR(r2, r1, Pico)
  353. eor r0, r0, #2
  354. ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
  355. movs r0, r0, lsr #1 @ +4-6 <<16
  356. add r2, r2, r3 @ map to our address
  357. ldrb r0, [r2, r0]
  358. movcc r0, r0, lsr #4
  359. andcs r0, r0, #0xf
  360. bx lr
  361. PicoReadS68k8_pr:
  362. and r2, r0, #0xfe00
  363. cmp r2, #0x8000
  364. bne m_s68k_read8_pcm
  365. m_s68k_read8_regs:
  366. bic r0, r0, #0xff0000
  367. bic r0, r0, #0x008000
  368. sub r2, r0, #0x0e
  369. cmp r2, #(0x30-0x0e)
  370. blo m_s68k_read8_comm
  371. stmfd sp!,{r0,lr}
  372. bic r0, r0, #1
  373. bl s68k_reg_read16
  374. ldmfd sp!,{r1,lr}
  375. tst r1, #1
  376. moveq r0, r0, lsr #8
  377. and r0, r0, #0xff
  378. bx lr
  379. m_s68k_read8_comm:
  380. PIC_LDR(r1, r2, Pico)
  381. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
  382. add r1, r1, #0x110000
  383. ldrb r1, [r1, r0]
  384. bic r0, r0, #1
  385. b s68k_poll_detect
  386. m_s68k_read8_pcm:
  387. tst r0, #0x8000
  388. bne m_read_null
  389. @ must not trash r3 and r12
  390. PIC_LDR(r1, r2, Pico)
  391. bic r0, r0, #0xff0000
  392. ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
  393. mov r2, #0x110000
  394. orr r2, r2, #0x002200
  395. cmp r0, #0x2000
  396. bge m_s68k_read8_pcm_ram
  397. cmp r0, #0x20
  398. movge r0, r0, lsr #1
  399. bge pcd_pcm_read
  400. mov r0, #0
  401. bx lr
  402. m_s68k_read8_pcm_ram:
  403. orr r2, r2, #0x40
  404. ldr r2, [r1, r2]
  405. add r1, r1, #0x100000 @ pcm_ram
  406. and r2, r2, #0x0f000000 @ bank
  407. add r1, r1, r2, lsr #12
  408. bic r0, r0, #0x00e000
  409. mov r0, r0, lsr #1
  410. ldrb r0, [r1, r0]
  411. bx lr
  412. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  413. PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
  414. mov r3, #0x080000 @ + ^ / 2
  415. b 0f
  416. PicoReadS68k16_dec1:
  417. mov r3, #0x0a0000 @ + ^ / 2
  418. 0:
  419. PIC_LDR(r2, r1, Pico)
  420. eor r0, r0, #2
  421. ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
  422. mov r0, r0, lsr #1 @ +4-6 <<16
  423. add r2, r2, r3 @ map to our address
  424. ldrb r0, [r2, r0]
  425. orr r0, r0, r0, lsl #4
  426. bic r0, r0, #0xf0
  427. bx lr
  428. PicoReadS68k16_pr:
  429. and r2, r0, #0xfe00
  430. cmp r2, #0x8000
  431. @ pcm is on 8-bit bus, would this be same as byte access?
  432. bne m_s68k_read8_pcm
  433. m_s68k_read16_regs:
  434. bic r0, r0, #0xff0000
  435. bic r0, r0, #0x008000
  436. bic r0, r0, #0x000001
  437. cmp r0, #8
  438. bne s68k_reg_read16
  439. mov r0, #1
  440. b cdc_host_r
  441. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  442. .macro m_s68k_write8_2M_decode
  443. PIC_LDR(r2, ip, Pico)
  444. eor r0, r0, #2
  445. ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
  446. movs r0, r0, lsr #1 @ +4-6 <<16
  447. add r2, r2, r3 @ map to our address
  448. .endm
  449. PicoWriteS68k8_dec_m2b0: @ overwrite
  450. ands r1, r1, #0x0f
  451. bxeq lr
  452. PicoWriteS68k8_dec_m0b0:
  453. mov r3, #0x080000
  454. b 0f
  455. PicoWriteS68k8_dec_m2b1: @ overwrite
  456. ands r1, r1, #0x0f
  457. bxeq lr
  458. PicoWriteS68k8_dec_m0b1:
  459. mov r3, #0x0a0000
  460. 0:
  461. m_s68k_write8_2M_decode
  462. ldrb r0, [r2, r0]!
  463. and r1, r1, #0x0f
  464. movcc r1, r1, lsl #4
  465. andcc r3, r0, #0x0f
  466. andcs r3, r0, #0xf0
  467. orr r3, r3, r1
  468. strneb r3, [r2]
  469. bx lr
  470. PicoWriteS68k8_dec_m1b0: @ underwrite
  471. mov r3, #0x080000
  472. b 0f
  473. PicoWriteS68k8_dec_m1b1:
  474. mov r3, #0x0a0000
  475. 0:
  476. ands r1, r1, #0x0f
  477. bxeq lr
  478. m_s68k_write8_2M_decode
  479. ldrb r0, [r2, r0]!
  480. movcc r1, r1, lsl #4
  481. andcc r3, r0, #0x0f
  482. andcs r3, r0, #0xf0
  483. teq r3, r0
  484. bxne lr
  485. orr r3, r3, r1
  486. strneb r3, [r2]
  487. bx lr
  488. PicoWriteS68k8_pr:
  489. and r2, r0, #0xfe00
  490. cmp r2, #0x8000
  491. bne m_s68k_write8_pcm
  492. m_s68k_write8_regs:
  493. bic r0, r0, #0xff0000
  494. bic r0, r0, #0x008000
  495. tst r0, #0x7e00
  496. movne r0, #0
  497. bxne lr
  498. sub r2, r0, #0x59
  499. cmp r2, #0x0f
  500. bhs s68k_reg_write8
  501. bic r0, r0, #1
  502. orr r1, r1, r1, lsl #8
  503. b s68k_reg_write16
  504. m_s68k_write8_pcm:
  505. tst r0, #0x8000
  506. bxne lr
  507. bic r0, r0, #0xff0000
  508. cmp r0, #0x12
  509. movlt r0, r0, lsr #1
  510. blt pcd_pcm_write
  511. cmp r0, #0x2000
  512. bxlt lr
  513. m_s68k_write8_pcm_ram:
  514. PIC_LDR(r3, r2, Pico)
  515. bic r0, r0, #0x00e000
  516. ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
  517. mov r0, r0, lsr #1
  518. add r2, r3, #0x110000
  519. add r2, r2, #0x002200
  520. add r2, r2, #0x000040
  521. ldr r2, [r2]
  522. add r3, r3, #0x100000 @ pcm_ram
  523. and r2, r2, #0x0f000000 @ bank
  524. add r3, r3, r2, lsr #12
  525. strb r1, [r3, r0]
  526. bx lr
  527. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  528. .macro m_s68k_write16_2M_decode
  529. PIC_LDR(r2, ip, Pico)
  530. eor r0, r0, #2
  531. ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
  532. mov r0, r0, lsr #1 @ +4-6 <<16
  533. add r2, r2, r3 @ map to our address
  534. .endm
  535. PicoWriteS68k16_dec_m0b0:
  536. mov r3, #0x080000
  537. b 0f
  538. PicoWriteS68k16_dec_m0b1:
  539. mov r3, #0x0a0000
  540. 0:
  541. m_s68k_write16_2M_decode
  542. bic r1, r1, #0xf0
  543. orr r1, r1, r1, lsr #4
  544. strb r1, [r2, r0]
  545. bx lr
  546. PicoWriteS68k16_dec_m1b0: @ underwrite
  547. mov r3, #0x080000
  548. b 0f
  549. PicoWriteS68k16_dec_m1b1:
  550. mov r3, #0x0a0000
  551. 0:
  552. bics r1, r1, #0xf000
  553. bicnes r1, r1, #0x00f0
  554. bxeq lr
  555. orr r1, r1, r1, lsr #4
  556. m_s68k_write16_2M_decode
  557. ldrb r0, [r2, r0]!
  558. and r3, r1, #0x0f
  559. and r1, r1, #0xf0
  560. tst r0, #0x0f
  561. orreq r0, r0, r3
  562. tst r0, #0xf0
  563. orreq r0, r0, r1
  564. strb r0, [r2]
  565. bx lr
  566. PicoWriteS68k16_dec_m2b0: @ overwrite
  567. mov r3, #0x080000
  568. b 0f
  569. PicoWriteS68k16_dec_m2b1:
  570. mov r3, #0x0a0000
  571. 0:
  572. bics r1, r1, #0xf000
  573. bicnes r1, r1, #0x00f0
  574. bxeq lr
  575. orr r1, r1, r1, lsr #4
  576. m_s68k_write16_2M_decode
  577. ldrb r0, [r2, r0]!
  578. ands r3, r1, #0x0f
  579. andne r0, r0, #0xf0
  580. orrne r0, r0, r3
  581. ands r1, r1, #0xf0
  582. andne r0, r0, #0x0f
  583. orrne r0, r0, r1
  584. strb r0, [r2]
  585. bx lr
  586. PicoWriteS68k16_pr:
  587. and r2, r0, #0xfe00
  588. cmp r2, #0x8000
  589. bne m_s68k_write8_pcm
  590. m_s68k_write16_regs:
  591. bic r0, r0, #0xff0000
  592. bic r0, r0, #0x008000
  593. bic r0, r0, #1
  594. tst r0, #0x7e00
  595. movne r0, #0
  596. bxne lr
  597. cmp r0, #0x0e
  598. bne s68k_reg_write16
  599. m_s68k_write16_regs_spec: @ special case
  600. PIC_LDR(r2, r0, Pico)
  601. mov r0, #0x110000
  602. ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
  603. add r0, r0, #0x00000f
  604. strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
  605. bx lr
  606. .global s68k_read8
  607. .global s68k_read16
  608. .global s68k_read32
  609. .global s68k_write8
  610. .global s68k_write16
  611. .global s68k_write32
  612. s68k_read8:
  613. PIC_LDR(r3, r2, s68k_read8_map)
  614. bic r0, r0, #0xff000000
  615. mov r2, r0, lsr #16
  616. ldr r3, [r3, r2, lsl #2]
  617. eor r2, r0, #1
  618. movs r3, r3, lsl #1
  619. ldrccb r0, [r3, r2]
  620. bxcc lr
  621. bx r3
  622. s68k_read16:
  623. PIC_LDR(r3, r2, s68k_read16_map)
  624. bic r0, r0, #0xff000000
  625. mov r2, r0, lsr #16
  626. ldr r3, [r3, r2, lsl #2]
  627. bic r0, r0, #1
  628. movs r3, r3, lsl #1
  629. ldrcch r0, [r3, r0]
  630. bxcc lr
  631. bx r3
  632. s68k_read32:
  633. PIC_LDR(r3, r2, s68k_read16_map)
  634. bic r0, r0, #0xff000000
  635. mov r2, r0, lsr #16
  636. ldr r3, [r3, r2, lsl #2]
  637. bic r0, r0, #1
  638. movs r3, r3, lsl #1
  639. ldrcch r1, [r3, r0]!
  640. ldrcch r0, [r3, #2]
  641. orrcc r0, r0, r1, lsl #16
  642. bxcc lr
  643. stmfd sp!, {r0, r3, r4, lr}
  644. mov lr, pc
  645. bx r3
  646. ldmfd sp!, {r1, r3}
  647. str r0, [sp]
  648. add r0, r1, #2
  649. mov lr, pc
  650. bx r3
  651. ldmfd sp!, {r1, lr}
  652. mov r0, r0, lsl #16
  653. mov r1, r1, lsl #16
  654. orr r0, r1, r0, lsr #16
  655. bx lr
  656. s68k_write8:
  657. PIC_LDR(r3, r2, s68k_write8_map)
  658. bic r0, r0, #0xff000000
  659. mov r2, r0, lsr #16
  660. ldr r3, [r3, r2, lsl #2]
  661. eor r2, r0, #1
  662. movs r3, r3, lsl #1
  663. strccb r1, [r3, r2]
  664. bxcc lr
  665. bx r3
  666. s68k_write16:
  667. PIC_LDR(r3, r2, s68k_write16_map)
  668. bic r0, r0, #0xff000000
  669. mov r2, r0, lsr #16
  670. ldr r3, [r3, r2, lsl #2]
  671. bic r0, r0, #1
  672. movs r3, r3, lsl #1
  673. strcch r1, [r3, r0]
  674. bxcc lr
  675. bx r3
  676. s68k_write32:
  677. PIC_LDR(r3, r2, s68k_write16_map)
  678. bic r0, r0, #0xff000000
  679. mov r2, r0, lsr #16
  680. ldr r3, [r3, r2, lsl #2]
  681. bic r0, r0, #1
  682. movs r3, r3, lsl #1
  683. movcc r2, r1, lsr #16
  684. strcch r2, [r3, r0]!
  685. strcch r1, [r3, #2]
  686. bxcc lr
  687. stmfd sp!, {r0, r1, r3, lr}
  688. mov r1, r1, lsr #16
  689. mov lr, pc
  690. bx r3
  691. ldmfd sp!, {r0, r1, r3, lr}
  692. add r0, r0, #2
  693. bx r3
  694. .pool
  695. @ vim:filetype=armasm