m68kif_cyclone.s 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * PicoDrive
  3. * (C) notaz, 2009
  4. *
  5. * This work is licensed under the terms of MAME license.
  6. * See COPYING file in the top-level directory.
  7. */
  8. .equ M68K_MEM_SHIFT, 16
  9. .global cyclone_checkpc
  10. .global cyclone_fetch8
  11. .global cyclone_fetch16
  12. .global cyclone_fetch32
  13. .global cyclone_read8
  14. .global cyclone_read16
  15. .global cyclone_read32
  16. .global cyclone_write8
  17. .global cyclone_write16
  18. .global cyclone_write32
  19. @ Warning: here we abuse the fact that we are only called
  20. @ from Cyclone, and assume that r7 contains context pointer.
  21. cyclone_checkpc:
  22. ldr r1, [r7, #0x60] @ membase
  23. sub r0, r0, r1
  24. and r3, r0, #0xff000000
  25. bic r0, r0, #1
  26. bics r2, r0, #0xff000000
  27. @ ouf, some Codemasters titles actually start at address 0
  28. @ beq crashed
  29. ldr r1, [r7, #0x6c] @ read16 map
  30. mov r2, r2, lsr #M68K_MEM_SHIFT
  31. ldr r1, [r1, r2, lsl #2]
  32. movs r1, r1, lsl #1
  33. subcc r1, r1, r3
  34. strcc r1, [r7, #0x60] @ membase
  35. addcc r0, r0, r1
  36. bxcc lr
  37. crashed:
  38. stmfd sp!,{lr}
  39. mov r1, r7
  40. bl cyclone_crashed
  41. ldr r0, [r7, #0x40] @ reload PC + membase
  42. ldmfd sp!,{pc}
  43. cyclone_read8: @ u32 a
  44. cyclone_fetch8:
  45. bic r0, r0, #0xff000000
  46. ldr r1, [r7, #0x68] @ read8 map
  47. mov r2, r0, lsr #M68K_MEM_SHIFT
  48. ldr r1, [r1, r2, lsl #2]
  49. eor r2, r0, #1
  50. movs r1, r1, lsl #1
  51. ldrccb r0, [r1, r2]
  52. bxcc lr
  53. bx r1
  54. cyclone_read16: @ u32 a
  55. cyclone_fetch16:
  56. bic r0, r0, #0xff000000
  57. ldr r1, [r7, #0x6c] @ read16 map
  58. mov r2, r0, lsr #M68K_MEM_SHIFT
  59. ldr r1, [r1, r2, lsl #2]
  60. bic r0, r0, #1
  61. movs r1, r1, lsl #1
  62. ldrcch r0, [r1, r0]
  63. bxcc lr
  64. bx r1
  65. cyclone_read32: @ u32 a
  66. cyclone_fetch32:
  67. bic r0, r0, #0xff000000
  68. ldr r1, [r7, #0x6c] @ read16 map
  69. mov r2, r0, lsr #M68K_MEM_SHIFT
  70. ldr r1, [r1, r2, lsl #2]
  71. bic r0, r0, #1
  72. movs r1, r1, lsl #1
  73. ldrcch r2, [r1, r0]!
  74. ldrcch r1, [r1, #2]
  75. orrcc r0, r1, r2, lsl #16
  76. bxcc lr
  77. stmfd sp!,{r0,r1,r2,lr}
  78. mov lr, pc
  79. bx r1
  80. mov r2, r0, lsl #16
  81. ldmfd sp!, {r0,r1}
  82. str r2, [sp]
  83. add r0, r0, #2
  84. mov lr, pc
  85. bx r1
  86. ldmfd sp!, {r1,lr}
  87. mov r0, r0, lsl #16
  88. orr r0, r1, r0, lsr #16
  89. bx lr
  90. cyclone_write8: @ u32 a, u8 d
  91. bic r0, r0, #0xff000000
  92. ldr r2, [r7, #0x74] @ write8 map
  93. mov r3, r0, lsr #M68K_MEM_SHIFT
  94. ldr r2, [r2, r3, lsl #2]
  95. eor r3, r0, #1
  96. movs r2, r2, lsl #1
  97. strccb r1, [r2, r3]
  98. bxcc lr
  99. bx r2
  100. cyclone_write16: @ u32 a, u16 d
  101. bic r0, r0, #0xff000000
  102. ldr r2, [r7, #0x78] @ write16 map
  103. mov r3, r0, lsr #M68K_MEM_SHIFT
  104. ldr r2, [r2, r3, lsl #2]
  105. bic r0, r0, #1
  106. movs r2, r2, lsl #1
  107. strcch r1, [r2, r0]
  108. bxcc lr
  109. bx r2
  110. cyclone_write32: @ u32 a, u32 d
  111. bic r0, r0, #0xff000000
  112. ldr r2, [r7, #0x78] @ write16 map
  113. mov r3, r0, lsr #M68K_MEM_SHIFT
  114. ldr r2, [r2, r3, lsl #2]
  115. bic r0, r0, #1
  116. movs r2, r2, lsl #1
  117. movcc r3, r1, lsr #16
  118. strcch r3, [r2, r0]!
  119. strcch r1, [r2, #2]
  120. bxcc lr
  121. stmfd sp!,{r0-r2,lr}
  122. mov r1, r1, lsr #16
  123. mov lr, pc
  124. bx r2
  125. ldmfd sp!,{r0-r2,lr}
  126. add r0, r0, #2
  127. bx r2
  128. @ vim:filetype=armasm