memory_arm.S 17 KB

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