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