m68kif_cyclone.s 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. beq crashed
  28. ldr r1, [r7, #0x6c] @ read16 map
  29. mov r2, r2, lsr #M68K_MEM_SHIFT
  30. ldr r1, [r1, r2, lsl #2]
  31. movs r1, r1, lsl #1
  32. subcc r1, r1, r3
  33. strcc r1, [r7, #0x60] @ membase
  34. addcc r0, r0, r1
  35. bxcc lr
  36. crashed:
  37. stmfd sp!,{lr}
  38. mov r1, r7
  39. bl cyclone_crashed
  40. ldr r0, [r7, #0x40] @ reload PC + membase
  41. ldmfd sp!,{pc}
  42. cyclone_read8: @ u32 a
  43. cyclone_fetch8:
  44. bic r0, r0, #0xff000000
  45. ldr r1, [r7, #0x68] @ read8 map
  46. mov r2, r0, lsr #M68K_MEM_SHIFT
  47. ldr r1, [r1, r2, lsl #2]
  48. eor r2, r0, #1
  49. movs r1, r1, lsl #1
  50. ldrccb r0, [r1, r2]
  51. bxcc lr
  52. bx r1
  53. cyclone_read16: @ u32 a
  54. cyclone_fetch16:
  55. bic r0, r0, #0xff000000
  56. ldr r1, [r7, #0x6c] @ read16 map
  57. mov r2, r0, lsr #M68K_MEM_SHIFT
  58. ldr r1, [r1, r2, lsl #2]
  59. bic r0, r0, #1
  60. movs r1, r1, lsl #1
  61. ldrcch r0, [r1, r0]
  62. bxcc lr
  63. bx r1
  64. cyclone_read32: @ u32 a
  65. cyclone_fetch32:
  66. bic r0, r0, #0xff000000
  67. ldr r1, [r7, #0x6c] @ read16 map
  68. mov r2, r0, lsr #M68K_MEM_SHIFT
  69. ldr r1, [r1, r2, lsl #2]
  70. bic r0, r0, #1
  71. movs r1, r1, lsl #1
  72. ldrcch r2, [r1, r0]!
  73. ldrcch r1, [r1, #2]
  74. orrcc r0, r1, r2, lsl #16
  75. bxcc lr
  76. stmfd sp!,{r0,r1,r2,lr}
  77. mov lr, pc
  78. bx r1
  79. mov r2, r0, lsl #16
  80. ldmfd sp!, {r0,r1}
  81. str r2, [sp]
  82. add r0, r0, #2
  83. mov lr, pc
  84. bx r1
  85. ldmfd sp!, {r1,lr}
  86. mov r0, r0, lsl #16
  87. orr r0, r1, r0, lsr #16
  88. bx lr
  89. cyclone_write8: @ u32 a, u8 d
  90. bic r0, r0, #0xff000000
  91. ldr r2, [r7, #0x74] @ write8 map
  92. mov r3, r0, lsr #M68K_MEM_SHIFT
  93. ldr r2, [r2, r3, lsl #2]
  94. eor r3, r0, #1
  95. movs r2, r2, lsl #1
  96. strccb r1, [r2, r3]
  97. bxcc lr
  98. bx r2
  99. cyclone_write16: @ u32 a, u16 d
  100. bic r0, r0, #0xff000000
  101. ldr r2, [r7, #0x78] @ write16 map
  102. mov r3, r0, lsr #M68K_MEM_SHIFT
  103. ldr r2, [r2, r3, lsl #2]
  104. bic r0, r0, #1
  105. movs r2, r2, lsl #1
  106. strcch r1, [r2, r0]
  107. bxcc lr
  108. bx r2
  109. cyclone_write32: @ u32 a, u32 d
  110. bic r0, r0, #0xff000000
  111. ldr r2, [r7, #0x78] @ write16 map
  112. mov r3, r0, lsr #M68K_MEM_SHIFT
  113. ldr r2, [r2, r3, lsl #2]
  114. bic r0, r0, #1
  115. movs r2, r2, lsl #1
  116. movcc r3, r1, lsr #16
  117. strcch r3, [r2, r0]!
  118. strcch r1, [r2, #2]
  119. bxcc lr
  120. stmfd sp!,{r0-r2,lr}
  121. mov r1, r1, lsr #16
  122. mov lr, pc
  123. bx r2
  124. ldmfd sp!,{r0-r2,lr}
  125. add r0, r0, #2
  126. bx r2
  127. @ vim:filetype=armasm