asmutils.s 4.8 KB

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