Replace Tmem_nasm.asm with C++ code. Patch by pyro.
[Glide64.git] / TexLoad16b.h
blobdaa260c45bfedc39ec28901b9dde92b205b991f8
1 /*
2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002 Dave2001
4 * Copyright (c) 2008 Günther <guenther.emu@freenet.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 //****************************************************************
23 // Glide64 - Glide Plugin for Nintendo 64 emulators (tested mostly with Project64)
24 // Project started on December 29th, 2001
26 // To modify Glide64:
27 // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
28 // * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
30 // Official Glide64 development channel: #Glide64 on EFnet
32 // Original author: Dave2001 (Dave2999@hotmail.com)
33 // Other authors: Gonetz, Gugaman
35 //****************************************************************
37 //****************************************************************
38 // Size: 2, Format: 0
40 DWORD Load16bRGBA (unsigned char * dst, unsigned char * src, int wid_64, int height, int line, int real_width, int tile)
42 if (wid_64 < 1) wid_64 = 1;
43 if (height < 1) height = 1;
44 int ext = (real_width - (wid_64 << 2)) << 1;
45 #ifndef GCC
46 __asm {
47 mov esi,dword ptr [src]
48 mov edi,dword ptr [dst]
50 mov ecx,dword ptr [height]
51 y_loop:
52 push ecx
54 mov ecx,dword ptr [wid_64]
55 x_loop:
56 mov eax,dword ptr [esi] // read both pixels
57 add esi,4
58 bswap eax
59 mov edx,eax
61 ror ax,1
62 ror eax,16
63 ror ax,1
65 mov dword ptr [edi],eax
66 add edi,4
68 // * copy
69 mov eax,dword ptr [esi] // read both pixels
70 add esi,4
71 bswap eax
72 mov edx,eax
74 ror ax,1
75 ror eax,16
76 ror ax,1
78 mov dword ptr [edi],eax
79 add edi,4
80 // *
82 dec ecx
83 jnz x_loop
85 pop ecx
86 dec ecx
87 jz end_y_loop
88 push ecx
90 add esi,dword ptr [line]
91 add edi,dword ptr [ext]
93 mov ecx,dword ptr [wid_64]
94 x_loop_2:
95 mov eax,dword ptr [esi+4] // read both pixels
96 bswap eax
97 mov edx,eax
99 ror ax,1
100 ror eax,16
101 ror ax,1
103 mov dword ptr [edi],eax
104 add edi,4
106 // * copy
107 mov eax,dword ptr [esi] // read both pixels
108 add esi,8
109 bswap eax
110 mov edx,eax
112 ror ax,1
113 ror eax,16
114 ror ax,1
116 mov dword ptr [edi],eax
117 add edi,4
118 // *
120 dec ecx
121 jnz x_loop_2
123 add esi,dword ptr [line]
124 add edi,dword ptr [ext]
126 pop ecx
127 dec ecx
128 jnz y_loop
130 end_y_loop:
132 #else // _WIN32
133 //printf("Load16bRGBA\n");
134 long lTemp, lHeight = (long) height;
135 asm volatile (
136 "y_loop7: \n"
137 "mov %[c], %[temp] \n"
139 "mov %[wid_64], %%ecx \n"
140 "x_loop7: \n"
141 "mov (%[src]), %%eax \n" // read both pixels
142 "add $4, %[src] \n"
143 "bswap %%eax \n"
144 "mov %%eax, %%edx \n"
146 "ror $1, %%ax \n"
147 "ror $16, %%eax \n"
148 "ror $1, %%ax \n"
150 "mov %%eax, (%[dst]) \n"
151 "add $4, %[dst] \n"
153 // * copy
154 "mov (%[src]), %%eax \n" // read both pixels
155 "add $4, %[src] \n"
156 "bswap %%eax \n"
157 "mov %%eax, %%edx \n"
159 "ror $1, %%ax \n"
160 "ror $16, %%eax \n"
161 "ror $1, %%ax \n"
163 "mov %%eax, (%[dst]) \n"
164 "add $4, %[dst] \n"
165 // *
167 "dec %%ecx \n"
168 "jnz x_loop7 \n"
170 "mov %[temp], %[c] \n"
171 "dec %%ecx \n"
172 "jz end_y_loop7 \n"
173 "mov %[c], %[temp] \n"
175 "add %[line], %[src] \n"
176 "add %[ext], %[dst] \n"
178 "mov %[wid_64], %%ecx \n"
179 "x_loop_27: \n"
180 "mov 4(%[src]), %%eax \n" // read both pixels
181 "bswap %%eax \n"
182 "mov %%eax, %%edx \n"
184 "ror $1, %%ax \n"
185 "ror $16, %%eax \n"
186 "ror $1, %%ax \n"
188 "mov %%eax, (%[dst]) \n"
189 "add $4, %[dst] \n"
191 // * copy
192 "mov (%[src]), %%eax \n" // read both pixels
193 "add $8, %[src] \n"
194 "bswap %%eax \n"
195 "mov %%eax, %%edx \n"
197 "ror $1, %%ax \n"
198 "ror $16, %%eax \n"
199 "ror $1, %%ax \n"
201 "mov %%eax, (%[dst]) \n"
202 "add $4, %[dst] \n"
203 // *
205 "dec %%ecx \n"
206 "jnz x_loop_27 \n"
208 "add %[line], %[src] \n"
209 "add %[ext], %[dst] \n"
211 "mov %[temp], %[c] \n"
212 "dec %%ecx \n"
213 "jnz y_loop7 \n"
215 "end_y_loop7: \n"
216 : [temp]"=m"(lTemp), [src]"+S"(src), [dst]"+D"(dst), [c]"+c"(lHeight)
217 : [wid_64] "g" (wid_64), [line] "g" ((uintptr_t)line), [ext] "g" ((uintptr_t)ext)
218 : "memory", "cc", "eax", "edx"
220 #endif // _WIN32
221 return (1 << 16) | GR_TEXFMT_ARGB_1555;
224 //****************************************************************
225 // Size: 2, Format: 3
227 // ** by Gugaman/Dave2001 **
229 DWORD Load16bIA (unsigned char * dst, unsigned char * src, int wid_64, int height, int line, int real_width, int tile)
231 if (wid_64 < 1) wid_64 = 1;
232 if (height < 1) height = 1;
233 int ext = (real_width - (wid_64 << 2)) << 1;
234 #ifndef GCC
235 __asm {
236 mov esi,dword ptr [src]
237 mov edi,dword ptr [dst]
239 mov ecx,dword ptr [height]
240 y_loop:
241 push ecx
243 mov ecx,dword ptr [wid_64]
244 x_loop:
245 mov eax,dword ptr [esi] // read both pixels
246 add esi,4
247 mov dword ptr [edi],eax
248 add edi,4
250 // * copy
251 mov eax,dword ptr [esi] // read both pixels
252 add esi,4
253 mov dword ptr [edi],eax
254 add edi,4
255 // *
257 dec ecx
258 jnz x_loop
260 pop ecx
261 dec ecx
262 jz end_y_loop
263 push ecx
265 add esi,dword ptr [line]
266 add edi,dword ptr [ext]
268 mov ecx,dword ptr [wid_64]
269 x_loop_2:
270 mov eax,dword ptr [esi+4] // read both pixels
271 mov dword ptr [edi],eax
272 add edi,4
274 // * copy
275 mov eax,dword ptr [esi] // read both pixels
276 add esi,8
277 mov dword ptr [edi],eax
278 add edi,4
279 // *
281 dec ecx
282 jnz x_loop_2
284 add esi,dword ptr [line]
285 add edi,dword ptr [ext]
287 pop ecx
288 dec ecx
289 jnz y_loop
291 end_y_loop:
293 #else // _WIN32
294 //printf("Load16bIA\n");
295 long lTemp, lHeight = (long) height;
296 asm volatile (
297 "y_loop8: \n"
298 "mov %[c], %[temp] \n"
300 "mov %[wid_64], %%ecx \n"
301 "x_loop8: \n"
302 "mov (%[src]), %%eax \n" // read both pixels
303 "add $4, %[src] \n"
304 "mov %%eax, (%[dst]) \n"
305 "add $4, %[dst] \n"
307 // * copy
308 "mov (%[src]), %%eax \n" // read both pixels
309 "add $4, %[src] \n"
310 "mov %%eax, (%[dst]) \n"
311 "add $4, %[dst] \n"
312 // *
314 "dec %%ecx \n"
315 "jnz x_loop8 \n"
317 "mov %[temp], %[c] \n"
318 "dec %%ecx \n"
319 "jz end_y_loop8 \n"
320 "mov %[c], %[temp] \n"
322 "add %[line], %[src] \n"
323 "add %[ext], %[dst] \n"
325 "mov %[wid_64], %%ecx \n"
326 "x_loop_28: \n"
327 "mov 4(%[src]), %%eax \n" // read both pixels
328 "mov %%eax, (%[dst]) \n"
329 "add $4, %[dst] \n"
331 // * copy
332 "mov (%[src]), %%eax \n" // read both pixels
333 "add $8, %[src] \n"
334 "mov %%eax, (%[dst]) \n"
335 "add $4, %[dst] \n"
336 // *
338 "dec %%ecx \n"
339 "jnz x_loop_28 \n"
341 "add %[line], %[src] \n"
342 "add %[ext], %[dst] \n"
344 "mov %[temp], %[c] \n"
345 "dec %%ecx \n"
346 "jnz y_loop8 \n"
348 "end_y_loop8: \n"
349 : [temp]"=m"(lTemp), [src]"+S"(src), [dst]"+D"(dst), [c]"+c"(lHeight)
350 : [wid_64] "g" (wid_64), [line] "g" ((uintptr_t)line), [ext] "g" ((uintptr_t)ext)
351 : "memory", "cc", "eax"
353 #endif // _WIN32
354 return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88;