arm_utils.s 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /*
  2. * some color conversion and blitting routines
  3. * (C) notaz, 2006-2009
  4. *
  5. * This work is licensed under the terms of MAME license.
  6. * See COPYING file in the top-level directory.
  7. */
  8. .text
  9. .align 4
  10. @ Convert 0000bbbb ggggrrrr 0000bbbb ggggrrrr
  11. @ to 00000000 rrrr0000 gggg0000 bbbb0000 ...
  12. @ lr = 0x00f000f0, out: r3=lower_pix, r2=higher_pix; trashes rin
  13. .macro convRGB32_2 rin sh=0
  14. and r2, lr, \rin, lsr #4 @ blue
  15. and r3, \rin, lr
  16. orr r2, r2, r3, lsl #8 @ g0b0g0b0
  17. mov r3, r2, lsl #16 @ g0b00000
  18. and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)
  19. orr r3, r3, \rin, lsr #16 @ g0b000r0
  20. .if \sh == 1
  21. mov r3, r3, ror #17 @ shadow mode
  22. .elseif \sh == 2
  23. adds r3, r3, #0x40000000 @ green
  24. orrcs r3, r3, lr, lsl #24
  25. mov r3, r3, ror #8
  26. adds r3, r3, #0x40000000
  27. orrcs r3, r3, lr, lsl #24
  28. mov r3, r3, ror #16
  29. adds r3, r3, #0x40000000
  30. orrcs r3, r3, lr, lsl #24
  31. mov r3, r3, ror #24
  32. .else
  33. mov r3, r3, ror #16 @ r3=low
  34. .endif
  35. orr r3, r3, r3, lsr #3
  36. str r3, [r0], #4
  37. mov r2, r2, lsr #16
  38. orr r2, r2, \rin, lsl #16
  39. .if \sh == 1
  40. mov r2, r2, lsr #1
  41. .elseif \sh == 2
  42. mov r2, r2, ror #8
  43. adds r2, r2, #0x40000000 @ blue
  44. orrcs r2, r2, lr, lsl #24
  45. mov r2, r2, ror #8
  46. adds r2, r2, #0x40000000
  47. orrcs r2, r2, lr, lsl #24
  48. mov r2, r2, ror #8
  49. adds r2, r2, #0x40000000
  50. orrcs r2, r2, lr, lsl #24
  51. mov r2, r2, ror #8
  52. .endif
  53. orr r2, r2, r2, lsr #3
  54. str r2, [r0], #4
  55. .endm
  56. .global bgr444_to_rgb32 @ void *to, void *from
  57. bgr444_to_rgb32:
  58. stmfd sp!, {r4-r7,lr}
  59. mov r12, #0x40>>3 @ repeats
  60. mov lr, #0x00f00000
  61. orr lr, lr, #0x00f0
  62. .loopRGB32:
  63. ldmia r1!, {r4-r7}
  64. convRGB32_2 r4
  65. convRGB32_2 r5
  66. convRGB32_2 r6
  67. convRGB32_2 r7
  68. subs r12, r12, #1
  69. bgt .loopRGB32
  70. ldmfd sp!, {r4-r7,pc}
  71. .global bgr444_to_rgb32_sh @ void *to, void *from
  72. bgr444_to_rgb32_sh:
  73. stmfd sp!, {r4-r7,lr}
  74. mov r12, #0x40>>3 @ repeats
  75. add r0, r0, #0x40*4
  76. mov lr, #0x00f00000
  77. orr lr, lr, #0x00f0
  78. .loopRGB32sh:
  79. ldmia r1!, {r4-r7}
  80. convRGB32_2 r4, 2
  81. convRGB32_2 r5, 2
  82. convRGB32_2 r6, 2
  83. convRGB32_2 r7, 2
  84. subs r12, r12, #1
  85. bgt .loopRGB32sh
  86. mov r12, #0x40>>3 @ repeats
  87. sub r1, r1, #0x40*2
  88. and lr, lr, lr, lsl #1 @ kill LSB for correct shadow colors
  89. .loopRGB32hi:
  90. ldmia r1!, {r4-r7}
  91. convRGB32_2 r4, 1
  92. convRGB32_2 r5, 1
  93. convRGB32_2 r6, 1
  94. convRGB32_2 r7, 1
  95. subs r12, r12, #1
  96. bgt .loopRGB32hi
  97. ldmfd sp!, {r4-r7,lr}
  98. bx lr
  99. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  100. @ mode2 blitter
  101. .global vidcpy_m2 @ void *dest, void *src, int m32col, int with_32c_border
  102. vidcpy_m2:
  103. stmfd sp!, {r4-r6,lr}
  104. mov r12, #224 @ lines
  105. add r0, r0, #320*8
  106. add r1, r1, #8
  107. mov lr, #0
  108. tst r2, r2
  109. movne lr, #64
  110. tstne r3, r3
  111. addne r0, r0, #32
  112. addne r1, r1, #32
  113. vidCpyM2_loop_out:
  114. mov r6, #10
  115. sub r6, r6, lr, lsr #5 @ -= 2 in 32col mode
  116. vidCpyM2_loop:
  117. subs r6, r6, #1
  118. ldmia r1!, {r2-r5}
  119. stmia r0!, {r2-r5}
  120. ldmia r1!, {r2-r5}
  121. stmia r0!, {r2-r5}
  122. bne vidCpyM2_loop
  123. subs r12,r12,#1
  124. add r0, r0, lr
  125. add r1, r1, #8
  126. add r1, r1, lr
  127. bne vidCpyM2_loop_out
  128. ldmfd sp!, {r4-r6,pc}
  129. .global vidcpy_m2_rot @ void *dest, void *src, int m32col, int with_32c_border
  130. vidcpy_m2_rot:
  131. stmfd sp!,{r4-r8,lr}
  132. add r1, r1, #8
  133. tst r2, r2
  134. subne r1, r1, #32 @ adjust
  135. mov r4, r0
  136. mov r5, r1
  137. mov r6, r2
  138. mov r7, #8+4
  139. vidcpy_m2_rot_loop:
  140. @ a bit lame but oh well..
  141. mov r0, r4
  142. mov r1, r5
  143. mov r2, r7
  144. mov r3, r6
  145. mov r8, #328
  146. adr lr, after_rot_blit8
  147. stmfd sp!,{r4-r8,lr}
  148. b rotated_blit8_2
  149. after_rot_blit8:
  150. add r5, r5, #328*4
  151. add r7, r7, #4
  152. cmp r7, #224+8+4
  153. ldmgefd sp!,{r4-r8,pc}
  154. b vidcpy_m2_rot_loop
  155. .global rotated_blit8 @ void *dst, void *linesx4, u32 y, int is_32col
  156. rotated_blit8:
  157. stmfd sp!,{r4-r8,lr}
  158. mov r8, #320
  159. rotated_blit8_2:
  160. add r0, r0, #(240*320)
  161. sub r0, r0, #(240+4) @ y starts from 4
  162. add r0, r0, r2
  163. tst r3, r3
  164. subne r0, r0, #(240*32)
  165. addne r1, r1, #32
  166. movne lr, #256/4
  167. moveq lr, #320/4
  168. rotated_blit_loop8:
  169. mov r6, r1
  170. ldr r2, [r6], r8
  171. ldr r3, [r6], r8
  172. ldr r4, [r6], r8
  173. ldr r5, [r6], r8
  174. mov r6, r2, lsl #24
  175. mov r6, r6, lsr #8
  176. orr r6, r6, r3, lsl #24
  177. mov r6, r6, lsr #8
  178. orr r6, r6, r4, lsl #24
  179. mov r6, r6, lsr #8
  180. orr r6, r6, r5, lsl #24
  181. str r6, [r0], #-240
  182. and r6, r3, #0xff00
  183. and r7, r2, #0xff00
  184. orr r6, r6, r7, lsr #8
  185. and r7, r4, #0xff00
  186. orr r6, r6, r7, lsl #8
  187. and r7, r5, #0xff00
  188. orr r6, r6, r7, lsl #16
  189. str r6, [r0], #-240
  190. and r6, r4, #0xff0000
  191. and r7, r2, #0xff0000
  192. orr r6, r6, r7, lsr #16
  193. and r7, r3, #0xff0000
  194. orr r6, r6, r7, lsr #8
  195. and r7, r5, #0xff0000
  196. orr r6, r6, r7, lsl #8
  197. str r6, [r0], #-240
  198. mov r6, r5, lsr #24
  199. mov r6, r6, lsl #8
  200. orr r6, r6, r4, lsr #24
  201. mov r6, r6, lsl #8
  202. orr r6, r6, r3, lsr #24
  203. mov r6, r6, lsl #8
  204. orr r6, r6, r2, lsr #24
  205. str r6, [r0], #-240
  206. subs lr, lr, #1
  207. add r1, r1, #4
  208. bne rotated_blit_loop8
  209. ldmfd sp!,{r4-r8,pc}
  210. @ input: r2-r5
  211. @ output: r7,r8
  212. @ trash: r6
  213. .macro rb_line_low
  214. mov r6, r2, lsl #16
  215. mov r7, r3, lsl #16
  216. orr r7, r7, r6, lsr #16
  217. mov r6, r4, lsl #16
  218. mov r8, r5, lsl #16
  219. orr r8, r8, r6, lsr #16
  220. .endm
  221. .macro rb_line_hi
  222. mov r6, r2, lsr #16
  223. mov r7, r3, lsr #16
  224. orr r7, r6, r7, lsl #16
  225. mov r6, r4, lsr #16
  226. mov r8, r5, lsr #16
  227. orr r8, r6, r8, lsl #16
  228. .endm
  229. .global rotated_blit16 @ void *dst, void *linesx4, u32 y, int is_32col
  230. rotated_blit16:
  231. stmfd sp!,{r4-r8,lr}
  232. add r0, r0, #(240*320)*2
  233. sub r0, r0, #(240+4)*2 @ y starts from 4
  234. add r0, r0, r2, lsl #1
  235. tst r3, r3
  236. subne r0, r0, #(240*32)*2
  237. addne r1, r1, #32*2
  238. movne lr, #256/4
  239. moveq lr, #320/4
  240. rotated_blit_loop16:
  241. ldr r2, [r1, #320*0*2]
  242. ldr r3, [r1, #320*1*2]
  243. ldr r4, [r1, #320*2*2]
  244. ldr r5, [r1, #320*3*2]
  245. rb_line_low
  246. stmia r0, {r7,r8}
  247. sub r0, r0, #240*2
  248. rb_line_hi
  249. stmia r0, {r7,r8}
  250. sub r0, r0, #240*2
  251. ldr r2, [r1, #320*0*2+4]
  252. ldr r3, [r1, #320*1*2+4]
  253. ldr r4, [r1, #320*2*2+4]
  254. ldr r5, [r1, #320*3*2+4]
  255. rb_line_low
  256. stmia r0, {r7,r8}
  257. sub r0, r0, #240*2
  258. rb_line_hi
  259. stmia r0, {r7,r8}
  260. sub r0, r0, #240*2
  261. subs lr, lr, #1
  262. add r1, r1, #8
  263. bne rotated_blit_loop16
  264. ldmfd sp!,{r4-r8,pc}
  265. .global spend_cycles @ c
  266. spend_cycles:
  267. mov r0, r0, lsr #2 @ 4 cycles/iteration
  268. sub r0, r0, #2 @ entry/exit/init
  269. .sc_loop:
  270. subs r0, r0, #1
  271. bpl .sc_loop
  272. bx lr
  273. @ vim:filetype=armasm