initial import
[libpicofe.git] / gp2x / asmutils.s
CommitLineData
720ee7f6 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
63vidConvCpyRGB32:\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
87vidConvCpyRGB32sh:\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
111vidConvCpyRGB32hi:\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
138vidCpyM2_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
144vidCpyM2_40_loop_out:\r
145 mov r6, #10\r
146vidCpyM2_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
164vidCpyM2_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
171vidCpyM2_32_loop_out:\r
172 mov r6, #8\r
173vidCpyM2_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
192vidCpyM2_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
203spend_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