Memory.s 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925
  1. @ vim:filetype=armasm
  2. @ memory handlers with banking support for SSF II - The New Challengers
  3. @ mostly based on Gens code
  4. @ (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
  5. @ All Rights Reserved
  6. .include "port_config.s"
  7. .text
  8. .align 4
  9. @ default jump tables
  10. m_read8_def_table:
  11. .long m_read8_rom0 @ 0x000000 - 0x07FFFF
  12. .long m_read8_rom1 @ 0x080000 - 0x0FFFFF
  13. .long m_read8_rom2 @ 0x100000 - 0x17FFFF
  14. .long m_read8_rom3 @ 0x180000 - 0x1FFFFF
  15. .long m_read8_rom4 @ 0x200000 - 0x27FFFF
  16. .long m_read8_rom5 @ 0x280000 - 0x2FFFFF
  17. .long m_read8_rom6 @ 0x300000 - 0x37FFFF
  18. .long m_read8_rom7 @ 0x380000 - 0x3FFFFF
  19. .long m_read8_rom8 @ 0x400000 - 0x47FFFF - for all those large ROM hacks
  20. .long m_read8_rom9 @ 0x480000 - 0x4FFFFF
  21. .long m_read8_romA @ 0x500000 - 0x57FFFF
  22. .long m_read8_romB @ 0x580000 - 0x5FFFFF
  23. .long m_read8_romC @ 0x600000 - 0x67FFFF
  24. .long m_read8_romD @ 0x680000 - 0x6FFFFF
  25. .long m_read8_romE @ 0x700000 - 0x77FFFF
  26. .long m_read8_romF @ 0x780000 - 0x7FFFFF
  27. .long m_read8_rom10 @ 0x800000 - 0x87FFFF
  28. .long m_read8_rom11 @ 0x880000 - 0x8FFFFF
  29. .long m_read8_rom12 @ 0x900000 - 0x97FFFF
  30. .long m_read8_rom13 @ 0x980000 - 0x9FFFFF
  31. .long m_read8_misc @ 0xA00000 - 0xA7FFFF
  32. .long m_read_null @ 0xA80000 - 0xAFFFFF
  33. .long m_read_null @ 0xB00000 - 0xB7FFFF
  34. .long m_read_null @ 0xB80000 - 0xBFFFFF
  35. .long m_read8_vdp @ 0xC00000 - 0xC7FFFF
  36. .long m_read8_vdp @ 0xC80000 - 0xCFFFFF
  37. .long m_read8_vdp @ 0xD00000 - 0xD7FFFF
  38. .long m_read8_vdp @ 0xD80000 - 0xDFFFFF
  39. .long m_read8_ram @ 0xE00000 - 0xE7FFFF
  40. .long m_read8_ram @ 0xE80000 - 0xEFFFFF
  41. .long m_read8_ram @ 0xF00000 - 0xF7FFFF
  42. .long m_read8_ram @ 0xF80000 - 0xFFFFFF
  43. m_read16_def_table:
  44. .long m_read16_rom0 @ 0x000000 - 0x07FFFF
  45. .long m_read16_rom1 @ 0x080000 - 0x0FFFFF
  46. .long m_read16_rom2 @ 0x100000 - 0x17FFFF
  47. .long m_read16_rom3 @ 0x180000 - 0x1FFFFF
  48. .long m_read16_rom4 @ 0x200000 - 0x27FFFF
  49. .long m_read16_rom5 @ 0x280000 - 0x2FFFFF
  50. .long m_read16_rom6 @ 0x300000 - 0x37FFFF
  51. .long m_read16_rom7 @ 0x380000 - 0x3FFFFF
  52. .long m_read16_rom8 @ 0x400000 - 0x47FFFF
  53. .long m_read16_rom9 @ 0x480000 - 0x4FFFFF
  54. .long m_read16_romA @ 0x500000 - 0x57FFFF
  55. .long m_read16_romB @ 0x580000 - 0x5FFFFF
  56. .long m_read16_romC @ 0x600000 - 0x67FFFF
  57. .long m_read16_romD @ 0x680000 - 0x6FFFFF
  58. .long m_read16_romE @ 0x700000 - 0x77FFFF
  59. .long m_read16_romF @ 0x780000 - 0x7FFFFF
  60. .long m_read16_rom10 @ 0x800000 - 0x87FFFF
  61. .long m_read16_rom11 @ 0x880000 - 0x8FFFFF
  62. .long m_read16_rom12 @ 0x900000 - 0x97FFFF
  63. .long m_read16_rom13 @ 0x980000 - 0x9FFFFF
  64. .long m_read16_misc @ 0xA00000 - 0xA7FFFF
  65. .long m_read_null @ 0xA80000 - 0xAFFFFF
  66. .long m_read_null @ 0xB00000 - 0xB7FFFF
  67. .long m_read_null @ 0xB80000 - 0xBFFFFF
  68. .long m_read16_vdp @ 0xC00000 - 0xC7FFFF
  69. .long m_read16_vdp @ 0xC80000 - 0xCFFFFF
  70. .long m_read16_vdp @ 0xD00000 - 0xD7FFFF
  71. .long m_read16_vdp @ 0xD80000 - 0xDFFFFF
  72. .long m_read16_ram @ 0xE00000 - 0xE7FFFF
  73. .long m_read16_ram @ 0xE80000 - 0xEFFFFF
  74. .long m_read16_ram @ 0xF00000 - 0xF7FFFF
  75. .long m_read16_ram @ 0xF80000 - 0xFFFFFF
  76. m_read32_def_table:
  77. .long m_read32_rom0 @ 0x000000 - 0x07FFFF
  78. .long m_read32_rom1 @ 0x080000 - 0x0FFFFF
  79. .long m_read32_rom2 @ 0x100000 - 0x17FFFF
  80. .long m_read32_rom3 @ 0x180000 - 0x1FFFFF
  81. .long m_read32_rom4 @ 0x200000 - 0x27FFFF
  82. .long m_read32_rom5 @ 0x280000 - 0x2FFFFF
  83. .long m_read32_rom6 @ 0x300000 - 0x37FFFF
  84. .long m_read32_rom7 @ 0x380000 - 0x3FFFFF
  85. .long m_read32_rom8 @ 0x400000 - 0x47FFFF
  86. .long m_read32_rom9 @ 0x480000 - 0x4FFFFF
  87. .long m_read32_romA @ 0x500000 - 0x57FFFF
  88. .long m_read32_romB @ 0x580000 - 0x5FFFFF
  89. .long m_read32_romC @ 0x600000 - 0x67FFFF
  90. .long m_read32_romD @ 0x680000 - 0x6FFFFF
  91. .long m_read32_romE @ 0x700000 - 0x77FFFF
  92. .long m_read32_romF @ 0x780000 - 0x7FFFFF
  93. .long m_read32_rom10 @ 0x800000 - 0x87FFFF
  94. .long m_read32_rom11 @ 0x880000 - 0x8FFFFF
  95. .long m_read32_rom12 @ 0x900000 - 0x97FFFF
  96. .long m_read32_rom13 @ 0x980000 - 0x9FFFFF
  97. .long m_read32_misc @ 0xA00000 - 0xA7FFFF
  98. .long m_read_null @ 0xA80000 - 0xAFFFFF
  99. .long m_read_null @ 0xB00000 - 0xB7FFFF
  100. .long m_read_null @ 0xB80000 - 0xBFFFFF
  101. .long m_read32_vdp @ 0xC00000 - 0xC7FFFF
  102. .long m_read32_vdp @ 0xC80000 - 0xCFFFFF
  103. .long m_read32_vdp @ 0xD00000 - 0xD7FFFF
  104. .long m_read32_vdp @ 0xD80000 - 0xDFFFFF
  105. .long m_read32_ram @ 0xE00000 - 0xE7FFFF
  106. .long m_read32_ram @ 0xE80000 - 0xEFFFFF
  107. .long m_read32_ram @ 0xF00000 - 0xF7FFFF
  108. .long m_read32_ram @ 0xF80000 - 0xFFFFFF
  109. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  110. .bss
  111. .align 4
  112. @.section .bss, "brw"
  113. @.data
  114. @ used tables
  115. m_read8_table:
  116. .skip 32*4
  117. m_read16_table:
  118. .skip 32*4
  119. m_read32_table:
  120. .skip 32*4
  121. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  122. .text
  123. .align 4
  124. .global PicoMemReset
  125. .global PicoRead8
  126. .global PicoRead16
  127. .global PicoRead32
  128. .global PicoWrite8
  129. .global PicoWriteRomHW_SSF2
  130. .global m_m68k_read8_misc
  131. .global m_m68k_write8_misc
  132. PicoMemReset:
  133. ldr r12,=(Pico+0x22204)
  134. ldr r12,[r12] @ romsize
  135. add r12,r12,#0x80000
  136. sub r12,r12,#1
  137. mov r12,r12,lsr #19
  138. ldr r0, =m_read8_table
  139. ldr r1, =m_read8_def_table
  140. mov r2, #32
  141. 1:
  142. ldr r3, [r1], #4
  143. str r3, [r0], #4
  144. subs r2, r2, #1
  145. bne 1b
  146. ldr r0, =m_read16_table
  147. ldr r1, =m_read16_def_table
  148. mov r2, #32
  149. 1:
  150. subs r2, r2, #1
  151. ldr r3, [r1], #4
  152. str r3, [r0], #4
  153. bne 1b
  154. ldr r0, =m_read32_table
  155. ldr r1, =m_read32_def_table
  156. mov r2, #32
  157. 1:
  158. subs r2, r2, #1
  159. ldr r3, [r1], #4
  160. str r3, [r0], #4
  161. bne 1b
  162. @ update memhandlers according to ROM size
  163. ldr r1, =m_read8_above_rom
  164. ldr r0, =m_read8_table
  165. mov r2, #20
  166. 1:
  167. sub r2, r2, #1
  168. cmp r2, r12
  169. blt 2f
  170. cmp r2, #4
  171. beq 1b @ do not touch the SRAM area
  172. str r1, [r0, r2, lsl #2]
  173. b 1b
  174. 2:
  175. ldr r1, =m_read16_above_rom
  176. ldr r0, =m_read16_table
  177. mov r2, #20
  178. 1:
  179. sub r2, r2, #1
  180. cmp r2, r12
  181. blt 2f
  182. cmp r2, #4
  183. beq 1b
  184. str r1, [r0, r2, lsl #2]
  185. b 1b
  186. 2:
  187. ldr r1, =m_read32_above_rom
  188. ldr r0, =m_read32_table
  189. mov r2, #20
  190. 1:
  191. sub r2, r2, #1
  192. cmp r2, r12
  193. blt 2f
  194. cmp r2, #4
  195. beq 1b
  196. str r1, [r0, r2, lsl #2]
  197. b 1b
  198. 2:
  199. bx lr
  200. .pool
  201. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  202. PicoRead8: @ u32 a
  203. ldr r2, =m_read8_table
  204. bic r0, r0, #0xff000000
  205. and r1, r0, #0x00f80000
  206. ldr pc, [r2, r1, lsr #17]
  207. PicoRead16: @ u32 a
  208. ldr r2, =m_read16_table
  209. bic r0, r0, #0xff000000
  210. and r1, r0, #0x00f80000
  211. ldr pc, [r2, r1, lsr #17]
  212. PicoRead32: @ u32 a
  213. ldr r2, =m_read32_table
  214. bic r0, r0, #0xff000000
  215. and r1, r0, #0x00f80000
  216. ldr pc, [r2, r1, lsr #17]
  217. .pool
  218. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  219. m_read_null:
  220. mov r0, #0
  221. bx lr
  222. .macro m_read8_rom sect
  223. ldr r1, =(Pico+0x22200)
  224. bic r0, r0, #0xf80000
  225. ldr r1, [r1]
  226. .if \sect
  227. orr r0, r0, #0x080000*\sect
  228. .endif
  229. eor r0, r0, #1
  230. ldrb r0, [r1, r0]
  231. bx lr
  232. .endm
  233. m_read8_rom0: @ 0x000000 - 0x07ffff
  234. m_read8_rom 0
  235. m_read8_rom1: @ 0x080000 - 0x0fffff
  236. m_read8_rom 1
  237. m_read8_rom2: @ 0x100000 - 0x17ffff
  238. m_read8_rom 2
  239. m_read8_rom3: @ 0x180000 - 0x1fffff
  240. m_read8_rom 3
  241. m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area
  242. ldr r2, =(SRam)
  243. ldr r3, =(Pico+0x22200)
  244. ldr r1, [r2, #8] @ SRam.end
  245. bic r0, r0, #0xf80000
  246. orr r0, r0, #0x200000
  247. cmp r0, r1
  248. bgt m_read8_nosram
  249. ldr r1, [r2, #4] @ SRam.start
  250. cmp r0, r1
  251. blt m_read8_nosram
  252. ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
  253. tst r1, #5
  254. bne SRAMRead
  255. m_read8_nosram:
  256. ldr r1, [r3, #4] @ romsize
  257. cmp r0, r1
  258. movgt r0, #0
  259. bxgt lr @ bad location
  260. ldr r1, [r3]
  261. eor r0, r0, #1
  262. ldrb r0, [r1, r0]
  263. bx lr
  264. m_read8_rom5: @ 0x280000 - 0x2fffff
  265. m_read8_rom 5
  266. m_read8_rom6: @ 0x300000 - 0x37ffff
  267. m_read8_rom 6
  268. m_read8_rom7: @ 0x380000 - 0x3fffff
  269. m_read8_rom 7
  270. m_read8_rom8: @ 0x400000 - 0x47ffff
  271. m_read8_rom 8
  272. m_read8_rom9: @ 0x480000 - 0x4fffff
  273. m_read8_rom 9
  274. m_read8_romA: @ 0x500000 - 0x57ffff
  275. m_read8_rom 0xA
  276. m_read8_romB: @ 0x580000 - 0x5fffff
  277. m_read8_rom 0xB
  278. m_read8_romC: @ 0x600000 - 0x67ffff
  279. m_read8_rom 0xC
  280. m_read8_romD: @ 0x680000 - 0x6fffff
  281. m_read8_rom 0xD
  282. m_read8_romE: @ 0x700000 - 0x77ffff
  283. m_read8_rom 0xE
  284. m_read8_romF: @ 0x780000 - 0x7fffff
  285. m_read8_rom 0xF
  286. m_read8_rom10: @ 0x800000 - 0x87ffff
  287. m_read8_rom 0x10
  288. m_read8_rom11: @ 0x880000 - 0x8fffff
  289. m_read8_rom 0x11
  290. m_read8_rom12: @ 0x900000 - 0x97ffff
  291. m_read8_rom 0x12
  292. m_read8_rom13: @ 0x980000 - 0x9fffff
  293. m_read8_rom 0x13
  294. m_m68k_read8_misc:
  295. m_read8_misc:
  296. bic r2, r0, #0x001f @ most commonly we get i/o port read,
  297. cmp r2, #0xa10000 @ so check for it first
  298. bne m_read8_misc2
  299. m_read8_misc_io:
  300. ands r0, r0, #0x1e
  301. beq m_read8_misc_hwreg
  302. cmp r0, #4
  303. movlt r0, #0
  304. moveq r0, #1
  305. ble PadRead
  306. ldr r3, =(Pico+0x22000)
  307. mov r0, r0, lsr #1 @ other IO ports (Pico.ioports[a])
  308. ldrb r0, [r3, r0]
  309. bx lr
  310. m_read8_misc_hwreg:
  311. ldr r3, =(Pico+0x22200)
  312. ldrb r0, [r3, #0x0f] @ Pico.m.hardware
  313. bx lr
  314. m_read8_misc2:
  315. mov r2, #0xa10000 @ games also like to poll busreq,
  316. orr r2, r2, #0x001100 @ so we'll try it now
  317. cmp r0, r2
  318. beq z80ReadBusReq
  319. and r2, r0, #0xff0000 @ finally it might be
  320. cmp r2, #0xa00000 @ z80 area
  321. bne m_read8_misc3
  322. tst r0, #0x4000
  323. beq z80Read8 @ z80 RAM
  324. and r2, r0, #0x6000
  325. cmp r2, #0x4000
  326. mvnne r0, #0
  327. bxne lr @ invalid
  328. b ym2612_read_local_68k
  329. m_read8_fake_ym2612:
  330. ldr r3, =(Pico+0x22200)
  331. ldrb r0, [r3, #8] @ Pico.m.rotate
  332. add r1, r0, #1
  333. strb r1, [r3, #8]
  334. and r0, r0, #3
  335. bx lr
  336. m_read8_misc3:
  337. @ if everything else fails, use generic handler
  338. stmfd sp!,{r0,lr}
  339. bic r0, r0, #1
  340. mov r1, #8
  341. bl OtherRead16
  342. ldmfd sp!,{r1,lr}
  343. tst r1, #1
  344. moveq r0, r0, lsr #8
  345. bx lr
  346. m_read8_vdp:
  347. tst r0, #0x70000
  348. tsteq r0, #0x000e0
  349. bxne lr @ invalid read
  350. b PicoVideoRead8
  351. m_read8_ram:
  352. ldr r1, =Pico
  353. bic r0, r0, #0xff0000
  354. eor r0, r0, #1
  355. ldrb r0, [r1, r0]
  356. bx lr
  357. m_read8_above_rom:
  358. @ might still be SRam (Micro Machines, HardBall '95)
  359. ldr r2, =(SRam)
  360. ldr r3, =(Pico+0x22200)
  361. ldr r1, [r2, #8] @ SRam.end
  362. cmp r0, r1
  363. bgt m_read8_ar_nosram
  364. ldr r1, [r2, #4] @ SRam.start
  365. cmp r0, r1
  366. blt m_read8_ar_nosram
  367. ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
  368. tst r1, #5
  369. bne SRAMRead
  370. m_read8_ar_nosram:
  371. ldr r2, =PicoRead16Hook
  372. stmfd sp!,{r0,lr}
  373. ldr r2, [r2]
  374. bic r0, r0, #1
  375. mov r1, #8
  376. mov lr, pc
  377. bx r2
  378. ldmfd sp!,{r1,lr}
  379. tst r1, #1
  380. moveq r0, r0, lsr #8
  381. bx lr
  382. .pool
  383. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  384. .macro m_read16_rom sect
  385. ldr r1, =(Pico+0x22200)
  386. bic r0, r0, #0xf80000
  387. ldr r1, [r1]
  388. bic r0, r0, #1
  389. .if \sect
  390. orr r0, r0, #0x080000*\sect
  391. .endif
  392. ldrh r0, [r1, r0]
  393. bx lr
  394. .endm
  395. m_read16_rom0: @ 0x000000 - 0x07ffff
  396. m_read16_rom 0
  397. m_read16_rom1: @ 0x080000 - 0x0fffff
  398. m_read16_rom 1
  399. m_read16_rom2: @ 0x100000 - 0x17ffff
  400. m_read16_rom 2
  401. m_read16_rom3: @ 0x180000 - 0x1fffff
  402. m_read16_rom 3
  403. m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)
  404. ldr r2, =(SRam)
  405. ldr r3, =(Pico+0x22200)
  406. ldr r1, [r2, #8] @ SRam.end
  407. bic r0, r0, #0xf80000
  408. bic r0, r0, #1
  409. orr r0, r0, #0x200000
  410. cmp r0, r1
  411. bgt m_read16_nosram
  412. ldr r1, [r2, #4] @ SRam.start
  413. cmp r0, r1
  414. blt m_read16_nosram
  415. ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
  416. tst r1, #5
  417. beq m_read16_nosram
  418. stmfd sp!,{lr}
  419. bl SRAMRead16
  420. ldmfd sp!,{pc}
  421. m_read16_nosram:
  422. ldr r1, [r3, #4] @ romsize
  423. cmp r0, r1
  424. movgt r0, #0
  425. bxgt lr @ bad location
  426. ldr r1, [r3] @ 1ci
  427. ldrh r0, [r1, r0]
  428. bx lr
  429. m_read16_rom5: @ 0x280000 - 0x2fffff
  430. m_read16_rom 5
  431. m_read16_rom6: @ 0x300000 - 0x37ffff
  432. m_read16_rom 6
  433. m_read16_rom7: @ 0x380000 - 0x3fffff
  434. m_read16_rom 7
  435. m_read16_rom8: @ 0x400000 - 0x47ffff
  436. m_read16_rom 8
  437. m_read16_rom9: @ 0x480000 - 0x4fffff
  438. m_read16_rom 9
  439. m_read16_romA: @ 0x500000 - 0x57ffff
  440. m_read16_rom 0xA
  441. m_read16_romB: @ 0x580000 - 0x5fffff
  442. m_read16_rom 0xB
  443. m_read16_romC: @ 0x600000 - 0x67ffff
  444. m_read16_rom 0xC
  445. m_read16_romD: @ 0x680000 - 0x6fffff
  446. m_read16_rom 0xD
  447. m_read16_romE: @ 0x700000 - 0x77ffff
  448. m_read16_rom 0xE
  449. m_read16_romF: @ 0x780000 - 0x7fffff
  450. m_read16_rom 0xF
  451. m_read16_rom10: @ 0x800000 - 0x87ffff
  452. m_read16_rom 0x10
  453. m_read16_rom11: @ 0x880000 - 0x8fffff
  454. m_read16_rom 0x11
  455. m_read16_rom12: @ 0x900000 - 0x97ffff
  456. m_read16_rom 0x12
  457. m_read16_rom13: @ 0x980000 - 0x9fffff
  458. m_read16_rom 0x13
  459. m_read16_misc:
  460. bic r0, r0, #1
  461. mov r1, #16
  462. b OtherRead16
  463. m_read16_vdp:
  464. tst r0, #0x70000 @ if ((a&0xe700e0)==0xc00000)
  465. tsteq r0, #0x000e0
  466. bxne lr @ invalid read
  467. bic r0, r0, #1
  468. b PicoVideoRead
  469. m_read16_ram:
  470. ldr r1, =Pico
  471. bic r0, r0, #0xff0000
  472. bic r0, r0, #1
  473. ldrh r0, [r1, r0]
  474. bx lr
  475. m_read16_above_rom:
  476. @ might still be SRam
  477. ldr r2, =(SRam)
  478. ldr r3, =(Pico+0x22200)
  479. ldr r1, [r2, #8] @ SRam.end
  480. bic r0, r0, #1
  481. cmp r0, r1
  482. bgt m_read16_ar_nosram
  483. ldr r1, [r2, #4] @ SRam.start
  484. cmp r0, r1
  485. blt m_read16_ar_nosram
  486. ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
  487. tst r1, #5
  488. beq m_read16_ar_nosram
  489. stmfd sp!,{lr}
  490. bl SRAMRead16
  491. ldmfd sp!,{pc}
  492. m_read16_ar_nosram:
  493. ldr r2, =PicoRead16Hook
  494. ldr r2, [r2]
  495. mov r1, #16
  496. bx r2
  497. .pool
  498. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  499. .macro m_read32_rom sect
  500. ldr r1, =(Pico+0x22200)
  501. bic r0, r0, #0xf80000
  502. ldr r1, [r1]
  503. bic r0, r0, #1
  504. .if \sect
  505. orr r0, r0, #0x080000*\sect
  506. .endif
  507. ldrh r0, [r1, r0]!
  508. ldrh r1, [r1, #2] @ 1ci
  509. orr r0, r1, r0, lsl #16
  510. bx lr
  511. .endm
  512. m_read32_rom0: @ 0x000000 - 0x07ffff
  513. m_read32_rom 0
  514. m_read32_rom1: @ 0x080000 - 0x0fffff
  515. m_read32_rom 1
  516. m_read32_rom2: @ 0x100000 - 0x17ffff
  517. m_read32_rom 2
  518. m_read32_rom3: @ 0x180000 - 0x1fffff
  519. m_read32_rom 3
  520. m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)
  521. ldr r2, =(SRam)
  522. ldr r3, =(Pico+0x22200)
  523. ldr r1, [r2, #8] @ SRam.end
  524. bic r0, r0, #0xf80000
  525. bic r0, r0, #1
  526. orr r0, r0, #0x200000
  527. cmp r0, r1
  528. bgt m_read32_nosram
  529. ldr r1, [r2, #4] @ SRam.start
  530. cmp r0, r1
  531. blt m_read32_nosram
  532. ldrb r1, [r3, #0x11] @ Pico.m.sram_reg
  533. tst r1, #5
  534. beq m_read32_nosram
  535. stmfd sp!,{r0,lr}
  536. bl SRAMRead16
  537. ldmfd sp!,{r1,lr}
  538. stmfd sp!,{r0,lr}
  539. add r0, r1, #2
  540. bl SRAMRead16
  541. ldmfd sp!,{r1,lr}
  542. orr r0, r0, r1, lsl #16
  543. bx lr
  544. m_read32_nosram:
  545. ldr r1, [r3, #4] @ romsize
  546. cmp r0, r1
  547. movgt r0, #0
  548. bxgt lr @ bad location
  549. ldr r1, [r3] @ (1ci)
  550. ldrh r0, [r1, r0]!
  551. ldrh r1, [r1, #2] @ (2ci)
  552. orr r0, r1, r0, lsl #16
  553. bx lr
  554. m_read32_rom5: @ 0x280000 - 0x2fffff
  555. m_read32_rom 5
  556. m_read32_rom6: @ 0x300000 - 0x37ffff
  557. m_read32_rom 6
  558. m_read32_rom7: @ 0x380000 - 0x3fffff
  559. m_read32_rom 7
  560. m_read32_rom8: @ 0x400000 - 0x47ffff
  561. m_read32_rom 8
  562. m_read32_rom9: @ 0x480000 - 0x4fffff
  563. m_read32_rom 9
  564. m_read32_romA: @ 0x500000 - 0x57ffff
  565. m_read32_rom 0xA
  566. m_read32_romB: @ 0x580000 - 0x5fffff
  567. m_read32_rom 0xB
  568. m_read32_romC: @ 0x600000 - 0x67ffff
  569. m_read32_rom 0xC
  570. m_read32_romD: @ 0x680000 - 0x6fffff
  571. m_read32_rom 0xD
  572. m_read32_romE: @ 0x700000 - 0x77ffff
  573. m_read32_rom 0xE
  574. m_read32_romF: @ 0x780000 - 0x7fffff
  575. m_read32_rom 0xF
  576. m_read32_rom10: @ 0x800000 - 0x87ffff
  577. m_read32_rom 0x10
  578. m_read32_rom11: @ 0x880000 - 0x8fffff
  579. m_read32_rom 0x11
  580. m_read32_rom12: @ 0x900000 - 0x97ffff
  581. m_read32_rom 0x12
  582. m_read32_rom13: @ 0x980000 - 0x9fffff
  583. m_read32_rom 0x13
  584. m_read32_misc:
  585. bic r0, r0, #1
  586. stmfd sp!,{r0,lr}
  587. mov r1, #32
  588. bl OtherRead16
  589. mov r1, r0
  590. ldmfd sp!,{r0}
  591. stmfd sp!,{r1}
  592. add r0, r0, #2
  593. mov r1, #32
  594. bl OtherRead16
  595. ldmfd sp!,{r1,lr}
  596. orr r0, r0, r1, lsl #16
  597. bx lr
  598. m_read32_vdp:
  599. tst r0, #0x70000
  600. tsteq r0, #0x000e0
  601. bxne lr @ invalid read
  602. bic r0, r0, #1
  603. add r1, r0, #2
  604. stmfd sp!,{r1,lr}
  605. bl PicoVideoRead
  606. swp r0, r0, [sp]
  607. bl PicoVideoRead
  608. ldmfd sp!,{r1,lr}
  609. orr r0, r0, r1, lsl #16
  610. bx lr
  611. m_read32_ram:
  612. ldr r1, =Pico
  613. bic r0, r0, #0xff0000
  614. bic r0, r0, #1
  615. ldrh r0, [r1, r0]!
  616. ldrh r1, [r1, #2] @ 2ci
  617. orr r0, r1, r0, lsl #16
  618. bx lr
  619. m_read32_above_rom:
  620. ldr r2, =PicoRead16Hook
  621. bic r0, r0, #1
  622. ldr r2, [r2]
  623. mov r1, #32
  624. stmfd sp!,{r0,r2,lr}
  625. mov lr, pc
  626. bx r2
  627. mov r1, r0
  628. ldmfd sp!,{r0,r2}
  629. stmfd sp!,{r1}
  630. add r0, r0, #2
  631. mov r1, #32
  632. mov lr, pc
  633. bx r2
  634. ldmfd sp!,{r1,lr}
  635. orr r0, r0, r1, lsl #16
  636. bx lr
  637. .pool
  638. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  639. PicoWriteRomHW_SSF2: @ u32 a, u32 d
  640. and r0, r0, #0xe
  641. movs r0, r0, lsr #1
  642. bne pwr_banking
  643. @ sram register
  644. ldr r2, =(Pico+0x22211) @ Pico.m.sram_reg
  645. ldrb r0, [r2]
  646. and r1, r1, #3
  647. bic r0, r0, #3
  648. orr r0, r0, r1
  649. strb r0, [r2]
  650. bx lr
  651. pwr_banking:
  652. and r1, r1, #0x1f
  653. ldr r3, =m_read8_def_table
  654. ldr r2, =m_read8_table
  655. ldr r12, [r3, r1, lsl #2]
  656. str r12, [r2, r0, lsl #2]
  657. ldr r3, =m_read16_def_table
  658. ldr r2, =m_read16_table
  659. ldr r12, [r3, r1, lsl #2]
  660. str r12, [r2, r0, lsl #2]
  661. ldr r3, =m_read32_def_table
  662. ldr r2, =m_read32_table
  663. ldr r12, [r3, r1, lsl #2]
  664. str r12, [r2, r0, lsl #2]
  665. bx lr
  666. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  667. @ Here we only handle most often used locations,
  668. @ everything else is passed to generic handlers
  669. PicoWrite8: @ u32 a, u8 d
  670. bic r0, r0, #0xff000000
  671. and r2, r0, #0x00e00000
  672. cmp r2, #0x00e00000 @ RAM?
  673. ldr r3, =Pico
  674. biceq r0, r0, #0x00ff0000
  675. eoreq r0, r0, #1
  676. streqb r1, [r3, r0]
  677. bxeq lr
  678. m_m68k_write8_misc:
  679. bic r2, r0, #0x1f @ most commonly we get i/o port write,
  680. cmp r2, #0xa10000 @ so check for it first
  681. bne m_write8_misc2
  682. m_write8_io:
  683. ldr r2, =PicoOpt
  684. and r0, r0, #0x1e
  685. ldr r2, [r2]
  686. ldr r3, =(Pico+0x22000) @ Pico.ioports
  687. tst r2, #0x20 @ 6 button pad?
  688. streqb r1, [r3, r0, lsr #1]
  689. bxeq lr
  690. cmp r0, #2
  691. cmpne r0, #4
  692. bne m_write8_io_done @ not likely to happen
  693. add r2, r3, #0x200 @ Pico+0x22200
  694. mov r12,#0
  695. cmp r0, #2
  696. streqb r12,[r2,#0x18]
  697. strneb r12,[r2,#0x19] @ Pico.m.padDelay[i] = 0
  698. tst r1, #0x40 @ TH
  699. beq m_write8_io_done
  700. ldrb r12,[r3, r0, lsr #1]
  701. tst r12,#0x40
  702. bne m_write8_io_done
  703. cmp r0, #2
  704. ldreqb r12,[r2,#0x0a]
  705. ldrneb r12,[r2,#0x0b] @ Pico.m.padTHPhase
  706. add r12,r12,#1
  707. streqb r12,[r2,#0x0a]
  708. strneb r12,[r2,#0x0b] @ Pico.m.padTHPhase
  709. m_write8_io_done:
  710. strb r1, [r3, r0, lsr #1]
  711. bx lr
  712. m_write8_misc2:
  713. and r2, r0, #0xff0000
  714. cmp r2, #0xa00000 @ z80 area?
  715. bne m_write8_not_z80
  716. tst r0, #0x4000
  717. bne m_write8_z80_not_ram
  718. ldr r3, =(Pico+0x20000) @ Pico.zram
  719. add r2, r3, #0x02200 @ Pico+0x22200
  720. ldrb r2, [r2, #9] @ Pico.m.z80Run
  721. bic r0, r0, #0xff0000
  722. bic r0, r0, #0x00e000
  723. tst r2, #1
  724. ldr r2, =SekCycleCnt
  725. streqb r1, [r3, r0] @ zram
  726. ldr r0, [r2]
  727. add r0, r0, #2 @ hack?
  728. str r0, [r2]
  729. bx lr
  730. m_write8_z80_not_ram:
  731. and r2, r0, #0x6000
  732. cmp r2, #0x4000
  733. bne m_write8_z80_not_ym2612
  734. ldr r3, =PicoOpt
  735. and r0, r0, #3
  736. ldr r3, [r3]
  737. mov r2, #0 @ is_from_z80 = 0
  738. tst r3, #1
  739. bxeq lr
  740. stmfd sp!,{lr}
  741. and r1, r1, #0xff
  742. bl ym2612_write_local
  743. ldr r2, =emustatus
  744. ldmfd sp!,{lr}
  745. ldr r1, [r2]
  746. and r0, r0, #1
  747. orr r1, r0, r1
  748. str r1, [r2] @ emustatus|=ym2612_write_local(a&3, d);
  749. bx lr
  750. m_write8_z80_not_ym2612: @ not too likely
  751. mov r2, r0, lsl #17
  752. bic r2, r2, #6<<17
  753. mov r3, #0x7f00
  754. orr r3, r3, #0x0011
  755. cmp r3, r2, lsr #17 @ psg @ z80 area?
  756. beq m_write8_psg
  757. and r2, r0, #0x7f00
  758. cmp r2, #0x6000 @ bank register?
  759. bxne lr @ invalid write
  760. m_write8_z80_bank_reg:
  761. ldr r3, =(Pico+0x22208) @ Pico.m
  762. ldrh r2, [r3, #0x0a]
  763. mov r1, r1, lsl #8
  764. orr r2, r1, r2, lsr #1
  765. bic r2, r2, #0xfe00
  766. strh r2, [r3, #0x0a]
  767. bx lr
  768. m_write8_not_z80:
  769. and r2, r0, #0xe70000
  770. cmp r2, #0xc00000 @ VDP area?
  771. bne OtherWrite8 @ passthrough
  772. and r2, r0, #0xf9
  773. cmp r2, #0x11
  774. bne OtherWrite8
  775. m_write8_psg:
  776. ldr r2, =PicoOpt
  777. and r0, r1, #0xff
  778. ldr r2, [r2]
  779. tst r2, #2
  780. bxeq lr
  781. b SN76496Write