Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-glide64/src/TexLoad16b.h
2 views
1
/*
2
* Glide64 - Glide video plugin for Nintendo 64 emulators.
3
* Copyright (c) 2002 Dave2001
4
* Copyright (c) 2008 Günther <[email protected]>
5
*
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.
10
*
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.
15
*
16
* You should have received a copy of the GNU General Public
17
* License along with this program; if not, write to the Free
18
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
* Boston, MA 02110-1301, USA
20
*/
21
22
//****************************************************************
23
//
24
// Glide64 - Glide Plugin for Nintendo 64 emulators (tested mostly with Project64)
25
// Project started on December 29th, 2001
26
//
27
// To modify Glide64:
28
// * 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.
29
// * 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
//
31
// Official Glide64 development channel: #Glide64 on EFnet
32
//
33
// Original author: Dave2001 ([email protected])
34
// Other authors: Gonetz, Gugaman
35
//
36
//****************************************************************
37
38
//****************************************************************
39
// Size: 2, Format: 0
40
41
DWORD Load16bRGBA (unsigned char * dst, unsigned char * src, int wid_64, int height, int line, int real_width, int tile)
42
{
43
if (wid_64 < 1) wid_64 = 1;
44
if (height < 1) height = 1;
45
int ext = (real_width - (wid_64 << 2)) << 1;
46
#if !defined(__GNUC__) && !defined(NO_ASM)
47
__asm {
48
mov esi,dword ptr [src]
49
mov edi,dword ptr [dst]
50
51
mov ecx,dword ptr [height]
52
y_loop:
53
push ecx
54
55
mov ecx,dword ptr [wid_64]
56
x_loop:
57
mov eax,dword ptr [esi] // read both pixels
58
add esi,4
59
bswap eax
60
mov edx,eax
61
62
ror ax,1
63
ror eax,16
64
ror ax,1
65
66
mov dword ptr [edi],eax
67
add edi,4
68
69
// * copy
70
mov eax,dword ptr [esi] // read both pixels
71
add esi,4
72
bswap eax
73
mov edx,eax
74
75
ror ax,1
76
ror eax,16
77
ror ax,1
78
79
mov dword ptr [edi],eax
80
add edi,4
81
// *
82
83
dec ecx
84
jnz x_loop
85
86
pop ecx
87
dec ecx
88
jz end_y_loop
89
push ecx
90
91
add esi,dword ptr [line]
92
add edi,dword ptr [ext]
93
94
mov ecx,dword ptr [wid_64]
95
x_loop_2:
96
mov eax,dword ptr [esi+4] // read both pixels
97
bswap eax
98
mov edx,eax
99
100
ror ax,1
101
ror eax,16
102
ror ax,1
103
104
mov dword ptr [edi],eax
105
add edi,4
106
107
// * copy
108
mov eax,dword ptr [esi] // read both pixels
109
add esi,8
110
bswap eax
111
mov edx,eax
112
113
ror ax,1
114
ror eax,16
115
ror ax,1
116
117
mov dword ptr [edi],eax
118
add edi,4
119
// *
120
121
dec ecx
122
jnz x_loop_2
123
124
add esi,dword ptr [line]
125
add edi,dword ptr [ext]
126
127
pop ecx
128
dec ecx
129
jnz y_loop
130
131
end_y_loop:
132
}
133
#elif !defined(NO_ASM)
134
//printf("Load16bRGBA\n");
135
long lTemp, lHeight = (long) height;
136
asm volatile (
137
"y_loop7: \n"
138
"mov %[c], %[temp] \n"
139
140
"mov %[wid_64], %%ecx \n"
141
"x_loop7: \n"
142
"mov (%[src]), %%eax \n" // read both pixels
143
"add $4, %[src] \n"
144
"bswap %%eax \n"
145
"mov %%eax, %%edx \n"
146
147
"ror $1, %%ax \n"
148
"ror $16, %%eax \n"
149
"ror $1, %%ax \n"
150
151
"mov %%eax, (%[dst]) \n"
152
"add $4, %[dst] \n"
153
154
// * copy
155
"mov (%[src]), %%eax \n" // read both pixels
156
"add $4, %[src] \n"
157
"bswap %%eax \n"
158
"mov %%eax, %%edx \n"
159
160
"ror $1, %%ax \n"
161
"ror $16, %%eax \n"
162
"ror $1, %%ax \n"
163
164
"mov %%eax, (%[dst]) \n"
165
"add $4, %[dst] \n"
166
// *
167
168
"dec %%ecx \n"
169
"jnz x_loop7 \n"
170
171
"mov %[temp], %[c] \n"
172
"dec %%ecx \n"
173
"jz end_y_loop7 \n"
174
"mov %[c], %[temp] \n"
175
176
"add %[line], %[src] \n"
177
"add %[ext], %[dst] \n"
178
179
"mov %[wid_64], %%ecx \n"
180
"x_loop_27: \n"
181
"mov 4(%[src]), %%eax \n" // read both pixels
182
"bswap %%eax \n"
183
"mov %%eax, %%edx \n"
184
185
"ror $1, %%ax \n"
186
"ror $16, %%eax \n"
187
"ror $1, %%ax \n"
188
189
"mov %%eax, (%[dst]) \n"
190
"add $4, %[dst] \n"
191
192
// * copy
193
"mov (%[src]), %%eax \n" // read both pixels
194
"add $8, %[src] \n"
195
"bswap %%eax \n"
196
"mov %%eax, %%edx \n"
197
198
"ror $1, %%ax \n"
199
"ror $16, %%eax \n"
200
"ror $1, %%ax \n"
201
202
"mov %%eax, (%[dst]) \n"
203
"add $4, %[dst] \n"
204
// *
205
206
"dec %%ecx \n"
207
"jnz x_loop_27 \n"
208
209
"add %[line], %[src] \n"
210
"add %[ext], %[dst] \n"
211
212
"mov %[temp], %[c] \n"
213
"dec %%ecx \n"
214
"jnz y_loop7 \n"
215
216
"end_y_loop7: \n"
217
: [temp]"=m"(lTemp), [src]"+S"(src), [dst]"+D"(dst), [c]"+c"(lHeight)
218
: [wid_64] "g" (wid_64), [line] "g" ((uintptr_t)line), [ext] "g" ((uintptr_t)ext)
219
: "memory", "cc", "eax", "edx"
220
);
221
#endif
222
return (1 << 16) | GR_TEXFMT_ARGB_1555;
223
}
224
225
//****************************************************************
226
// Size: 2, Format: 3
227
//
228
// ** by Gugaman/Dave2001 **
229
230
DWORD Load16bIA (unsigned char * dst, unsigned char * src, int wid_64, int height, int line, int real_width, int tile)
231
{
232
if (wid_64 < 1) wid_64 = 1;
233
if (height < 1) height = 1;
234
int ext = (real_width - (wid_64 << 2)) << 1;
235
#if !defined(__GNUC__) && !defined(NO_ASM)
236
__asm {
237
mov esi,dword ptr [src]
238
mov edi,dword ptr [dst]
239
240
mov ecx,dword ptr [height]
241
y_loop:
242
push ecx
243
244
mov ecx,dword ptr [wid_64]
245
x_loop:
246
mov eax,dword ptr [esi] // read both pixels
247
add esi,4
248
mov dword ptr [edi],eax
249
add edi,4
250
251
// * copy
252
mov eax,dword ptr [esi] // read both pixels
253
add esi,4
254
mov dword ptr [edi],eax
255
add edi,4
256
// *
257
258
dec ecx
259
jnz x_loop
260
261
pop ecx
262
dec ecx
263
jz end_y_loop
264
push ecx
265
266
add esi,dword ptr [line]
267
add edi,dword ptr [ext]
268
269
mov ecx,dword ptr [wid_64]
270
x_loop_2:
271
mov eax,dword ptr [esi+4] // read both pixels
272
mov dword ptr [edi],eax
273
add edi,4
274
275
// * copy
276
mov eax,dword ptr [esi] // read both pixels
277
add esi,8
278
mov dword ptr [edi],eax
279
add edi,4
280
// *
281
282
dec ecx
283
jnz x_loop_2
284
285
add esi,dword ptr [line]
286
add edi,dword ptr [ext]
287
288
pop ecx
289
dec ecx
290
jnz y_loop
291
292
end_y_loop:
293
}
294
#elif !defined(NO_ASM)
295
//printf("Load16bIA\n");
296
long lTemp, lHeight = (long) height;
297
asm volatile (
298
"y_loop8: \n"
299
"mov %[c], %[temp] \n"
300
301
"mov %[wid_64], %%ecx \n"
302
"x_loop8: \n"
303
"mov (%[src]), %%eax \n" // read both pixels
304
"add $4, %[src] \n"
305
"mov %%eax, (%[dst]) \n"
306
"add $4, %[dst] \n"
307
308
// * copy
309
"mov (%[src]), %%eax \n" // read both pixels
310
"add $4, %[src] \n"
311
"mov %%eax, (%[dst]) \n"
312
"add $4, %[dst] \n"
313
// *
314
315
"dec %%ecx \n"
316
"jnz x_loop8 \n"
317
318
"mov %[temp], %[c] \n"
319
"dec %%ecx \n"
320
"jz end_y_loop8 \n"
321
"mov %[c], %[temp] \n"
322
323
"add %[line], %[src] \n"
324
"add %[ext], %[dst] \n"
325
326
"mov %[wid_64], %%ecx \n"
327
"x_loop_28: \n"
328
"mov 4(%[src]), %%eax \n" // read both pixels
329
"mov %%eax, (%[dst]) \n"
330
"add $4, %[dst] \n"
331
332
// * copy
333
"mov (%[src]), %%eax \n" // read both pixels
334
"add $8, %[src] \n"
335
"mov %%eax, (%[dst]) \n"
336
"add $4, %[dst] \n"
337
// *
338
339
"dec %%ecx \n"
340
"jnz x_loop_28 \n"
341
342
"add %[line], %[src] \n"
343
"add %[ext], %[dst] \n"
344
345
"mov %[temp], %[c] \n"
346
"dec %%ecx \n"
347
"jnz y_loop8 \n"
348
349
"end_y_loop8: \n"
350
: [temp]"=m"(lTemp), [src]"+S"(src), [dst]"+D"(dst), [c]"+c"(lHeight)
351
: [wid_64] "g" (wid_64), [line] "g" ((uintptr_t)line), [ext] "g" ((uintptr_t)ext)
352
: "memory", "cc", "eax"
353
);
354
#endif
355
return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88;
356
}
357
358
359