m68kif_cyclone.s 3.3 KB

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