arm_utils.s 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
  11. @ to 00000000 rrr00000 ggg00000 bbb00000 ...
  12. @ lr = 0x00e000e0, 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, #0xe0000000
  25. mov r3, r3, ror #8
  26. adds r3, r3, #0x40000000
  27. orrcs r3, r3, #0xe0000000
  28. mov r3, r3, ror #16
  29. adds r3, r3, #0x40000000
  30. orrcs r3, r3, #0xe0000000
  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, #0xe0000000
  45. mov r2, r2, ror #8
  46. adds r2, r2, #0x40000000
  47. orrcs r2, r2, #0xe0000000
  48. mov r2, r2, ror #8
  49. adds r2, r2, #0x40000000
  50. orrcs r2, r2, #0xe0000000
  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, #0x00e00000
  61. orr lr, lr, #0x00e0
  62. .loopRGB32:
  63. subs r12, r12, #1
  64. ldmia r1!, {r4-r7}
  65. convRGB32_2 r4
  66. convRGB32_2 r5
  67. convRGB32_2 r6
  68. convRGB32_2 r7
  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, #0x00e00000
  77. orr lr, lr, #0x00e0
  78. .loopRGB32sh:
  79. subs r12, r12, #1
  80. ldmia r1!, {r4-r7}
  81. convRGB32_2 r4, 2
  82. convRGB32_2 r5, 2
  83. convRGB32_2 r6, 2
  84. convRGB32_2 r7, 2
  85. bgt .loopRGB32sh
  86. mov r12, #0x40>>3 @ repeats
  87. sub r1, r1, #0x40*2
  88. .loopRGB32hi:
  89. ldmia r1!, {r4-r7}
  90. convRGB32_2 r4, 1
  91. convRGB32_2 r5, 1
  92. convRGB32_2 r6, 1
  93. convRGB32_2 r7, 1
  94. subs r12, r12, #1
  95. bgt .loopRGB32hi
  96. ldmfd sp!, {r4-r7,lr}
  97. bx lr
  98. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  99. @ mode2 blitter
  100. .global vidcpy_m2 @ void *dest, void *src, int m32col, int with_32c_border
  101. vidcpy_m2:
  102. stmfd sp!, {r4-r6,lr}
  103. mov r12, #224 @ lines
  104. add r0, r0, #320*8
  105. add r1, r1, #8
  106. mov lr, #0
  107. tst r2, r2
  108. movne lr, #64
  109. tstne r3, r3
  110. addne r0, r0, #32
  111. addne r1, r1, #32
  112. vidCpyM2_loop_out:
  113. mov r6, #10
  114. sub r6, r6, lr, lsr #5 @ -= 2 in 32col mode
  115. vidCpyM2_loop:
  116. subs r6, r6, #1
  117. ldmia r1!, {r2-r5}
  118. stmia r0!, {r2-r5}
  119. ldmia r1!, {r2-r5}
  120. stmia r0!, {r2-r5}
  121. bne vidCpyM2_loop
  122. subs r12,r12,#1
  123. add r0, r0, lr
  124. add r1, r1, #8
  125. add r1, r1, lr
  126. bne vidCpyM2_loop_out
  127. ldmfd sp!, {r4-r6,pc}
  128. .global vidcpy_m2_rot @ void *dest, void *src, int m32col, int with_32c_border
  129. vidcpy_m2_rot:
  130. stmfd sp!,{r4-r8,lr}
  131. add r1, r1, #8
  132. tst r2, r2
  133. subne r1, r1, #32 @ adjust
  134. mov r4, r0
  135. mov r5, r1
  136. mov r6, r2
  137. mov r7, #8+4
  138. vidcpy_m2_rot_loop:
  139. @ a bit lame but oh well..
  140. mov r0, r4
  141. mov r1, r5
  142. mov r2, r7
  143. mov r3, r6
  144. mov r8, #328
  145. adr lr, after_rot_blit8
  146. stmfd sp!,{r4-r8,lr}
  147. b rotated_blit8_2
  148. after_rot_blit8:
  149. add r5, r5, #328*4
  150. add r7, r7, #4
  151. cmp r7, #224+8+4
  152. ldmgefd sp!,{r4-r8,pc}
  153. b vidcpy_m2_rot_loop
  154. .global rotated_blit8 @ void *dst, void *linesx4, u32 y, int is_32col
  155. rotated_blit8:
  156. stmfd sp!,{r4-r8,lr}
  157. mov r8, #320
  158. rotated_blit8_2:
  159. add r0, r0, #(240*320)
  160. sub r0, r0, #(240+4) @ y starts from 4
  161. add r0, r0, r2
  162. tst r3, r3
  163. subne r0, r0, #(240*32)
  164. addne r1, r1, #32
  165. movne lr, #256/4
  166. moveq lr, #320/4
  167. rotated_blit_loop8:
  168. mov r6, r1
  169. ldr r2, [r6], r8
  170. ldr r3, [r6], r8
  171. ldr r4, [r6], r8
  172. ldr r5, [r6], r8
  173. mov r6, r2, lsl #24
  174. mov r6, r6, lsr #8
  175. orr r6, r6, r3, lsl #24
  176. mov r6, r6, lsr #8
  177. orr r6, r6, r4, lsl #24
  178. mov r6, r6, lsr #8
  179. orr r6, r6, r5, lsl #24
  180. str r6, [r0], #-240
  181. and r6, r3, #0xff00
  182. and r7, r2, #0xff00
  183. orr r6, r6, r7, lsr #8
  184. and r7, r4, #0xff00
  185. orr r6, r6, r7, lsl #8
  186. and r7, r5, #0xff00
  187. orr r6, r6, r7, lsl #16
  188. str r6, [r0], #-240
  189. and r6, r4, #0xff0000
  190. and r7, r2, #0xff0000
  191. orr r6, r6, r7, lsr #16
  192. and r7, r3, #0xff0000
  193. orr r6, r6, r7, lsr #8
  194. and r7, r5, #0xff0000
  195. orr r6, r6, r7, lsl #8
  196. str r6, [r0], #-240
  197. mov r6, r5, lsr #24
  198. mov r6, r6, lsl #8
  199. orr r6, r6, r4, lsr #24
  200. mov r6, r6, lsl #8
  201. orr r6, r6, r3, lsr #24
  202. mov r6, r6, lsl #8
  203. orr r6, r6, r2, lsr #24
  204. str r6, [r0], #-240
  205. subs lr, lr, #1
  206. add r1, r1, #4
  207. bne rotated_blit_loop8
  208. ldmfd sp!,{r4-r8,pc}
  209. @ input: r2-r5
  210. @ output: r7,r8
  211. @ trash: r6
  212. .macro rb_line_low
  213. mov r6, r2, lsl #16
  214. mov r7, r3, lsl #16
  215. orr r7, r7, r6, lsr #16
  216. mov r6, r4, lsl #16
  217. mov r8, r5, lsl #16
  218. orr r8, r8, r6, lsr #16
  219. .endm
  220. .macro rb_line_hi
  221. mov r6, r2, lsr #16
  222. mov r7, r3, lsr #16
  223. orr r7, r6, r7, lsl #16
  224. mov r6, r4, lsr #16
  225. mov r8, r5, lsr #16
  226. orr r8, r6, r8, lsl #16
  227. .endm
  228. .global rotated_blit16 @ void *dst, void *linesx4, u32 y, int is_32col
  229. rotated_blit16:
  230. stmfd sp!,{r4-r8,lr}
  231. add r0, r0, #(240*320)*2
  232. sub r0, r0, #(240+4)*2 @ y starts from 4
  233. add r0, r0, r2, lsl #1
  234. tst r3, r3
  235. subne r0, r0, #(240*32)*2
  236. addne r1, r1, #32*2
  237. movne lr, #256/4
  238. moveq lr, #320/4
  239. rotated_blit_loop16:
  240. ldr r2, [r1, #320*0*2]
  241. ldr r3, [r1, #320*1*2]
  242. ldr r4, [r1, #320*2*2]
  243. ldr r5, [r1, #320*3*2]
  244. rb_line_low
  245. stmia r0, {r7,r8}
  246. sub r0, r0, #240*2
  247. rb_line_hi
  248. stmia r0, {r7,r8}
  249. sub r0, r0, #240*2
  250. ldr r2, [r1, #320*0*2+4]
  251. ldr r3, [r1, #320*1*2+4]
  252. ldr r4, [r1, #320*2*2+4]
  253. ldr r5, [r1, #320*3*2+4]
  254. rb_line_low
  255. stmia r0, {r7,r8}
  256. sub r0, r0, #240*2
  257. rb_line_hi
  258. stmia r0, {r7,r8}
  259. sub r0, r0, #240*2
  260. subs lr, lr, #1
  261. add r1, r1, #8
  262. bne rotated_blit_loop16
  263. ldmfd sp!,{r4-r8,pc}
  264. .global spend_cycles @ c
  265. spend_cycles:
  266. mov r0, r0, lsr #2 @ 4 cycles/iteration
  267. sub r0, r0, #2 @ entry/exit/init
  268. .sc_loop:
  269. subs r0, r0, #1
  270. bpl .sc_loop
  271. bx lr
  272. @ vim:filetype=armasm