misc_arm.s 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. @*
  2. @* Memory converters for different modes
  3. @* (C) notaz, 2007-2008
  4. @*
  5. @* This work is licensed under the terms of MAME license.
  6. @* See COPYING file in the top-level directory.
  7. @*
  8. @ r10 is tmp, io1 is lsb halfword, io2 is msb
  9. @ | 0 1 | 2 3 | -> | 0 2 | 1 3 | (little endian)
  10. .macro _conv_reg io1 io2
  11. mov r10, \io2, lsl #16
  12. and \io2, \io2, r11, lsl #16
  13. orr \io2, \io2, \io1, lsr #16
  14. and \io1, \io1, r11
  15. orr \io1, \io1, r10
  16. /*
  17. mov \io2, \io2, ror #16
  18. mov r10, \io1, lsl #16
  19. orr r10, r10, \io2, lsr #16
  20. mov \io1, \io1, lsr #16
  21. orr \io1, \io1, \io2, lsl #16
  22. mov \io2, r10, ror #16
  23. */
  24. .endm
  25. .global wram_2M_to_1M
  26. wram_2M_to_1M:
  27. stmfd sp!,{r4-r11,lr}
  28. add r1, r0, #0x60000 @ m1M_b1
  29. add r0, r0, #0x40000 @ m1M_b0
  30. mov r2, r0 @ m2M
  31. mov r11, #0xff
  32. orr r11, r11, r11, lsl #8
  33. mov r12, #(0x40000/8/4)
  34. _2Mto1M_loop:
  35. ldmdb r2!,{r3-r9,lr}
  36. _conv_reg r3,r4
  37. _conv_reg r5,r6
  38. _conv_reg r7,r8
  39. _conv_reg r9,lr
  40. subs r12, r12, #1
  41. stmdb r0!,{r3,r5,r7,r9}
  42. stmdb r1!,{r4,r6,r8,lr}
  43. bne _2Mto1M_loop
  44. ldmfd sp!,{r4-r11,pc}
  45. .global wram_1M_to_2M
  46. wram_1M_to_2M:
  47. stmfd sp!,{r4-r11,lr}
  48. mov r2, r0 @ m2M
  49. add r1, r0, #0x40000 @ m1M_b1
  50. add r0, r0, #0x20000 @ m1M_b0
  51. mov r11, #0xff
  52. orr r11, r11, r11, lsl #8
  53. mov r12, #(0x40000/8/4)
  54. _1Mto2M_loop:
  55. ldmia r0!,{r3,r5,r7,r9}
  56. ldmia r1!,{r4,r6,r8,lr}
  57. _conv_reg r3,r4
  58. _conv_reg r5,r6
  59. _conv_reg r7,r8
  60. _conv_reg r9,lr
  61. subs r12, r12, #1
  62. stmia r2!,{r3-r9,lr}
  63. bne _1Mto2M_loop
  64. ldmfd sp!,{r4-r11,pc}
  65. @ vim:filetype=armasm