memory_arm.S 19 KB

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