memory_arm.s 18 KB

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