arm_utils.s 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. @ vim:filetype=armasm
  2. @ some color conversion and blitting routines
  3. @ (c) Copyright 2006, 2007 notaz
  4. @ All Rights Reserved
  5. @ vim:filetype=armasm
  6. .text
  7. .align 4
  8. @ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
  9. @ to 00000000 rrr00000 ggg00000 bbb00000 ...
  10. @ lr = 0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin
  11. @ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)
  12. .macro convRGB32_2 rin sh=0
  13. and r2, lr, \rin, lsr #4 @ blue
  14. and r3, \rin, lr
  15. orr r2, r2, r3, lsl #8 @ g0b0g0b0
  16. mov r3, r2, lsl #16 @ g0b00000
  17. and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)
  18. orr r3, r3, \rin, lsr #16 @ g0b000r0
  19. .if \sh == 1
  20. mov r3, r3, ror #17 @ shadow mode
  21. .elseif \sh == 2
  22. adds r3, r3, #0x40000000 @ green
  23. orrcs r3, r3, #0xe0000000
  24. mov r3, r3, ror #8
  25. adds r3, r3, #0x40000000
  26. orrcs r3, r3, #0xe0000000
  27. mov r3, r3, ror #16
  28. adds r3, r3, #0x40000000
  29. orrcs r3, r3, #0xe0000000
  30. mov r3, r3, ror #24
  31. .else
  32. mov r3, r3, ror #16 @ r3=low
  33. .endif
  34. orr r3, r3, r3, lsr #3
  35. str r3, [r0], #4
  36. mov r2, r2, lsr #16
  37. orr r2, r2, \rin, lsl #16
  38. .if \sh == 1
  39. mov r2, r2, lsr #1
  40. .elseif \sh == 2
  41. mov r2, r2, ror #8
  42. adds r2, r2, #0x40000000 @ blue
  43. orrcs r2, r2, #0xe0000000
  44. mov r2, r2, ror #8
  45. adds r2, r2, #0x40000000
  46. orrcs r2, r2, #0xe0000000
  47. mov r2, r2, ror #8
  48. adds r2, r2, #0x40000000
  49. orrcs r2, r2, #0xe0000000
  50. mov r2, r2, ror #8
  51. .endif
  52. orr r2, r2, r2, lsr #3
  53. str r2, [r0], #4
  54. .endm
  55. .global vidConvCpyRGB32 @ void *to, void *from, int pixels
  56. vidConvCpyRGB32:
  57. stmfd sp!, {r4-r7,lr}
  58. mov r12, r2, lsr #3 @ repeats
  59. mov lr, #0x00e00000
  60. orr lr, lr, #0x00e0
  61. .loopRGB32:
  62. subs r12, r12, #1
  63. ldmia r1!, {r4-r7}
  64. convRGB32_2 r4
  65. convRGB32_2 r5
  66. convRGB32_2 r6
  67. convRGB32_2 r7
  68. bgt .loopRGB32
  69. ldmfd sp!, {r4-r7,lr}
  70. bx lr
  71. .global vidConvCpyRGB32sh @ void *to, void *from, int pixels
  72. vidConvCpyRGB32sh:
  73. stmfd sp!, {r4-r7,lr}
  74. mov r12, r2, lsr #3 @ repeats
  75. mov lr, #0x00e00000
  76. orr lr, lr, #0x00e0
  77. .loopRGB32sh:
  78. subs r12, r12, #1
  79. ldmia r1!, {r4-r7}
  80. convRGB32_2 r4, 1
  81. convRGB32_2 r5, 1
  82. convRGB32_2 r6, 1
  83. convRGB32_2 r7, 1
  84. bgt .loopRGB32sh
  85. ldmfd sp!, {r4-r7,lr}
  86. bx lr
  87. .global vidConvCpyRGB32hi @ void *to, void *from, int pixels
  88. vidConvCpyRGB32hi:
  89. stmfd sp!, {r4-r7,lr}
  90. mov r12, r2, lsr #3 @ repeats
  91. mov lr, #0x00e00000
  92. orr lr, lr, #0x00e0
  93. .loopRGB32hi:
  94. ldmia r1!, {r4-r7}
  95. convRGB32_2 r4, 2
  96. convRGB32_2 r5, 2
  97. convRGB32_2 r6, 2
  98. convRGB32_2 r7, 2
  99. subs r12, r12, #1
  100. bgt .loopRGB32hi
  101. ldmfd sp!, {r4-r7,lr}
  102. bx lr
  103. @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  104. @ mode2 blitter for 40 cols
  105. .global vidCpyM2_40col @ void *dest, void *src
  106. vidCpyM2_40col:
  107. stmfd sp!, {r4-r6,lr}
  108. mov r12, #224 @ lines
  109. add r1, r1, #8
  110. vidCpyM2_40_loop_out:
  111. mov r6, #10
  112. vidCpyM2_40_loop:
  113. subs r6, r6, #1
  114. ldmia r1!, {r2-r5}
  115. stmia r0!, {r2-r5}
  116. ldmia r1!, {r2-r5}
  117. stmia r0!, {r2-r5}
  118. bne vidCpyM2_40_loop
  119. subs r12,r12,#1
  120. add r1, r1, #8
  121. bne vidCpyM2_40_loop_out
  122. ldmfd sp!, {r4-r6,lr}
  123. bx lr
  124. @ mode2 blitter for 32 cols
  125. .global vidCpyM2_32col @ void *dest, void *src
  126. vidCpyM2_32col:
  127. stmfd sp!, {r4-r6,lr}
  128. mov r12, #224 @ lines
  129. add r1, r1, #8
  130. add r0, r0, #32
  131. vidCpyM2_32_loop_out:
  132. mov r6, #8
  133. vidCpyM2_32_loop:
  134. subs r6, r6, #1
  135. ldmia r1!, {r2-r5}
  136. stmia r0!, {r2-r5}
  137. ldmia r1!, {r2-r5}
  138. stmia r0!, {r2-r5}
  139. bne vidCpyM2_32_loop
  140. subs r12,r12,#1
  141. add r0, r0, #64
  142. add r1, r1, #8+64
  143. bne vidCpyM2_32_loop_out
  144. ldmfd sp!, {r4-r6,lr}
  145. bx lr
  146. @ mode2 blitter for 32 cols with no borders
  147. .global vidCpyM2_32col_nobord @ void *dest, void *src
  148. vidCpyM2_32col_nobord:
  149. stmfd sp!, {r4-r6,lr}
  150. mov r12, #224 @ lines
  151. add r1, r1, #8
  152. b vidCpyM2_32_loop_out
  153. .global spend_cycles @ c
  154. spend_cycles:
  155. mov r0, r0, lsr #2 @ 4 cycles/iteration
  156. sub r0, r0, #2 @ entry/exit/init
  157. .sc_loop:
  158. subs r0, r0, #1
  159. bpl .sc_loop
  160. bx lr
  161. .global flushcache
  162. flushcache:
  163. swi #0x9f0002
  164. mov pc, lr