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
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
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 DWORD
Load8bCI (unsigned char * dst
, unsigned char * src
, int wid_64
, int height
, int line
, int real_width
, int tile
)
39 if (wid_64
< 1) wid_64
= 1;
40 if (height
< 1) height
= 1;
41 int ext
= (real_width
- (wid_64
<< 3)) << 1;
42 unsigned short * pal
= rdp
.pal_8
;
44 if (rdp
.tlut_mode
== 2)
48 mov ebx
,dword ptr
[pal
]
50 mov esi
,dword ptr
[src
]
51 mov edi
,dword ptr
[dst
]
53 mov ecx
,dword ptr
[height
]
57 mov ecx
,dword ptr
[wid_64
]
61 mov eax
,dword ptr
[esi
] // read all 4 pixels
69 mov cx
,word ptr
[ebx
+eax
]
76 mov cx
,word ptr
[ebx
+eax
]
79 mov dword ptr
[edi
],ecx
87 mov cx
,word ptr
[ebx
+eax
]
93 mov cx
,word ptr
[ebx
+edx
]
96 mov dword ptr
[edi
],ecx
101 mov eax
,dword ptr
[esi
] // read all 4 pixels
106 // 1st dword output {
109 mov cx
,word ptr
[ebx
+eax
]
116 mov cx
,word ptr
[ebx
+eax
]
119 mov dword ptr
[edi
],ecx
123 // 2nd dword output {
127 mov cx
,word ptr
[ebx
+eax
]
133 mov cx
,word ptr
[ebx
+edx
]
136 mov dword ptr
[edi
],ecx
151 add esi
,dword ptr
[line
]
152 add edi
,dword ptr
[ext
]
154 mov ecx
,dword ptr
[wid_64
]
158 mov eax
,dword ptr
[esi
+4] // read all 4 pixels
162 // 1st dword output {
165 mov cx
,word ptr
[ebx
+eax
]
172 mov cx
,word ptr
[ebx
+eax
]
175 mov dword ptr
[edi
],ecx
179 // 2nd dword output {
183 mov cx
,word ptr
[ebx
+eax
]
189 mov cx
,word ptr
[ebx
+edx
]
192 mov dword ptr
[edi
],ecx
197 mov eax
,dword ptr
[esi
] // read all 4 pixels
202 // 1st dword output {
205 mov cx
,word ptr
[ebx
+eax
]
212 mov cx
,word ptr
[ebx
+eax
]
215 mov dword ptr
[edi
],ecx
219 // 2nd dword output {
223 mov cx
,word ptr
[ebx
+eax
]
229 mov cx
,word ptr
[ebx
+edx
]
232 mov dword ptr
[edi
],ecx
242 add esi
,dword ptr
[line
]
243 add edi
,dword ptr
[ext
]
252 //printf("Load8bCI1\n");
253 long lTempX
, lTempY
, lHeight
= (long) height
;
254 intptr_t fake_eax
, fake_edx
;
257 "mov %[c], %[tempy] \n"
259 "mov %[wid_64], %%ecx \n"
261 "mov %[c], %[tempx] \n"
263 "mov (%[src]), %%eax \n" // read all 4 pixels
266 "mov %%eax, %%edx \n"
268 // 1st dword output {
270 "and $0x1FE, %%eax \n"
271 "mov (%[pal],%[a]), %%cx \n"
275 "mov %%edx, %%eax \n"
277 "and $0x1FE, %%eax \n"
278 "mov (%[pal],%[a]), %%cx \n"
281 "mov %%ecx, (%[dst]) \n"
285 // 2nd dword output {
286 "mov %%edx, %%eax \n"
288 "and $0x1FE, %%eax \n"
289 "mov (%[pal],%[a]), %%cx \n"
294 "and $0x1FE, %%edx \n"
295 "mov (%[pal],%[d]), %%cx \n"
298 "mov %%ecx, (%[dst]) \n"
303 "mov (%[src]), %%eax \n" // read all 4 pixels
306 "mov %%eax, %%edx \n"
308 // 1st dword output {
310 "and $0x1FE, %%eax \n"
311 "mov (%[pal],%[a]), %%cx \n"
315 "mov %%edx, %%eax \n"
317 "and $0x1FE, %%eax \n"
318 "mov (%[pal],%[a]), %%cx \n"
321 "mov %%ecx, (%[dst]) \n"
325 // 2nd dword output {
326 "mov %%edx, %%eax \n"
328 "and $0x1FE, %%eax \n"
329 "mov (%[pal],%[a]), %%cx \n"
334 "and $0x1FE, %%edx \n"
335 "mov (%[pal],%[d]), %%cx \n"
338 "mov %%ecx, (%[dst]) \n"
343 "mov %[tempx], %[c] \n"
348 "mov %[tempy], %[c] \n"
351 "mov %[c], %[tempy] \n"
353 "add %[line], %[src] \n"
354 "add %[ext], %[dst] \n"
356 "mov %[wid_64], %%ecx \n"
358 "mov %[c], %[tempx] \n"
360 "mov 4(%[src]), %%eax \n" // read all 4 pixels
362 "mov %%eax, %%edx \n"
364 // 1st dword output {
366 "and $0x1FE, %%eax \n"
367 "mov (%[pal],%[a]), %%cx \n"
371 "mov %%edx, %%eax \n"
373 "and $0x1FE, %%eax \n"
374 "mov (%[pal],%[a]), %%cx \n"
377 "mov %%ecx, (%[dst]) \n"
381 // 2nd dword output {
382 "mov %%edx, %%eax \n"
384 "and $0x1FE, %%eax \n"
385 "mov (%[pal],%[a]), %%cx \n"
390 "and $0x1FE, %%edx \n"
391 "mov (%[pal],%[d]), %%cx \n"
394 "mov %%ecx, (%[dst]) \n"
399 "mov (%[src]), %%eax \n" // read all 4 pixels
402 "mov %%eax, %%edx \n"
404 // 1st dword output {
406 "and $0x1FE, %%eax \n"
407 "mov (%[pal],%[a]), %%cx \n"
411 "mov %%edx, %%eax \n"
413 "and $0x1FE, %%eax \n"
414 "mov (%[pal],%[a]), %%cx \n"
417 "mov %%ecx, (%[dst]) \n"
421 // 2nd dword output {
422 "mov %%edx, %%eax \n"
424 "and $0x1FE, %%eax \n"
425 "mov (%[pal],%[a]), %%cx \n"
430 "and $0x1FE, %%edx \n"
431 "mov (%[pal],%[d]), %%cx \n"
434 "mov %%ecx, (%[dst]) \n"
439 "mov %[tempx], %[c] \n"
443 "add %[line], %[src] \n"
444 "add %[ext], %[dst] \n"
446 "mov %[tempy], %[c] \n"
451 : [tempx
]"=m"(lTempX
), [tempy
]"=m"(lTempY
), [a
] "=&a" (fake_eax
), [d
] "=&d" (fake_edx
), [src
]"+S"(src
), [dst
]"+D"(dst
), [c
]"+c"(lHeight
)
452 : [pal
] "r" (pal
), [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
456 return (1 << 16) | GR_TEXFMT_ARGB_1555
;
462 mov ebx
,dword ptr
[pal
]
464 mov esi
,dword ptr
[src
]
465 mov edi
,dword ptr
[dst
]
467 mov ecx
,dword ptr
[height
]
471 mov ecx
,dword ptr
[wid_64
]
475 mov eax
,dword ptr
[esi
] // read all 4 pixels
480 // 1st dword output {
483 mov cx
,word ptr
[ebx
+eax
]
490 mov cx
,word ptr
[ebx
+eax
]
493 mov dword ptr
[edi
],ecx
497 // 2nd dword output {
501 mov cx
,word ptr
[ebx
+eax
]
507 mov cx
,word ptr
[ebx
+edx
]
510 mov dword ptr
[edi
],ecx
515 mov eax
,dword ptr
[esi
] // read all 4 pixels
520 // 1st dword output {
523 mov cx
,word ptr
[ebx
+eax
]
530 mov cx
,word ptr
[ebx
+eax
]
533 mov dword ptr
[edi
],ecx
537 // 2nd dword output {
541 mov cx
,word ptr
[ebx
+eax
]
547 mov cx
,word ptr
[ebx
+edx
]
550 mov dword ptr
[edi
],ecx
565 add esi
,dword ptr
[line
]
566 add edi
,dword ptr
[ext
]
568 mov ecx
,dword ptr
[wid_64
]
572 mov eax
,dword ptr
[esi
+4] // read all 4 pixels
576 // 1st dword output {
579 mov cx
,word ptr
[ebx
+eax
]
586 mov cx
,word ptr
[ebx
+eax
]
589 mov dword ptr
[edi
],ecx
593 // 2nd dword output {
597 mov cx
,word ptr
[ebx
+eax
]
603 mov cx
,word ptr
[ebx
+edx
]
606 mov dword ptr
[edi
],ecx
611 mov eax
,dword ptr
[esi
] // read all 4 pixels
616 // 1st dword output {
619 mov cx
,word ptr
[ebx
+eax
]
626 mov cx
,word ptr
[ebx
+eax
]
629 mov dword ptr
[edi
],ecx
633 // 2nd dword output {
637 mov cx
,word ptr
[ebx
+eax
]
643 mov cx
,word ptr
[ebx
+edx
]
646 mov dword ptr
[edi
],ecx
656 add esi
,dword ptr
[line
]
657 add edi
,dword ptr
[ext
]
666 //printf("Load8bCI1\n");
667 long lTempX
, lTempY
, lHeight
= (long) height
;
668 intptr_t fake_eax
, fake_edx
;
671 "mov %[c], %[tempy] \n"
673 "mov %[wid_64], %%ecx \n"
675 "mov %[c], %[tempx] \n"
677 "mov (%[src]), %%eax \n" // read all 4 pixels
680 "mov %%eax, %%edx \n"
682 // 1st dword output {
684 "and $0x1FE, %%eax \n"
685 "mov (%[pal],%[a]), %%cx \n"
689 "mov %%edx, %%eax \n"
691 "and $0x1FE, %%eax \n"
692 "mov (%[pal],%[a]), %%cx \n"
695 "mov %%ecx, (%[dst]) \n"
699 // 2nd dword output {
700 "mov %%edx, %%eax \n"
702 "and $0x1FE, %%eax \n"
703 "mov (%[pal],%[a]), %%cx \n"
708 "and $0x1FE, %%edx \n"
709 "mov (%[pal],%[d]), %%cx \n"
712 "mov %%ecx, (%[dst]) \n"
717 "mov (%[src]), %%eax \n" // read all 4 pixels
720 "mov %%eax, %%edx \n"
722 // 1st dword output {
724 "and $0x1FE, %%eax \n"
725 "mov (%[pal],%[a]), %%cx \n"
729 "mov %%edx, %%eax \n"
731 "and $0x1FE, %%eax \n"
732 "mov (%[pal],%[a]), %%cx \n"
735 "mov %%ecx, (%[dst]) \n"
739 // 2nd dword output {
740 "mov %%edx, %%eax \n"
742 "and $0x1FE, %%eax \n"
743 "mov (%[pal],%[a]), %%cx \n"
748 "and $0x1FE, %%edx \n"
749 "mov (%[pal],%[d]), %%cx \n"
752 "mov %%ecx, (%[dst]) \n"
757 "mov %[tempx], %[c] \n"
761 "mov %[tempy], %[c] \n"
763 "jz ia_end_y_loop2 \n"
764 "mov %[c], %[tempy] \n"
766 "add %[line], %[src] \n"
767 "add %[ext], %[dst] \n"
769 "mov %[wid_64], %%ecx \n"
771 "mov %[c], %[tempx] \n"
773 "mov 4(%[src]), %%eax \n" // read all 4 pixels
775 "mov %%eax, %%edx \n"
777 // 1st dword output {
779 "and $0x1FE, %%eax \n"
780 "mov (%[pal],%[a]), %%cx \n"
784 "mov %%edx, %%eax \n"
786 "and $0x1FE, %%eax \n"
787 "mov (%[pal],%[a]), %%cx \n"
790 "mov %%ecx, (%[dst]) \n"
794 // 2nd dword output {
795 "mov %%edx, %%eax \n"
797 "and $0x1FE, %%eax \n"
798 "mov (%[pal],%[a]), %%cx \n"
803 "and $0x1FE, %%edx \n"
804 "mov (%[pal],%[d]), %%cx \n"
807 "mov %%ecx, (%[dst]) \n"
812 "mov (%[src]), %%eax \n" // read all 4 pixels
815 "mov %%eax, %%edx \n"
817 // 1st dword output {
819 "and $0x1FE, %%eax \n"
820 "mov (%[pal],%[a]), %%cx \n"
824 "mov %%edx, %%eax \n"
826 "and $0x1FE, %%eax \n"
827 "mov (%[pal],%[a]), %%cx \n"
830 "mov %%ecx, (%[dst]) \n"
834 // 2nd dword output {
835 "mov %%edx, %%eax \n"
837 "and $0x1FE, %%eax \n"
838 "mov (%[pal],%[a]), %%cx \n"
843 "and $0x1FE, %%edx \n"
844 "mov (%[pal],%[d]), %%cx \n"
847 "mov %%ecx, (%[dst]) \n"
852 "mov %[tempx], %[c] \n"
854 "jnz ia_x_loop_22 \n"
856 "add %[line], %[src] \n"
857 "add %[ext], %[dst] \n"
859 "mov %[tempy], %[c] \n"
864 : [tempx
]"=m"(lTempX
), [tempy
]"=m"(lTempY
), [a
] "=&a" (fake_eax
), [d
] "=&d" (fake_edx
), [src
]"+S"(src
), [dst
]"+D"(dst
), [c
]"+c"(lHeight
)
865 : [pal
] "r" (pal
), [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
869 return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88
;
875 //****************************************************************
876 // Size: 1, Format: 3
880 DWORD
Load8bIA (unsigned char * dst
, unsigned char * src
, int wid_64
, int height
, int line
, int real_width
, int tile
)
882 if (rdp
.tlut_mode
!= 0)
883 return Load8bCI (dst
, src
, wid_64
, height
, line
, real_width
, tile
);
885 if (wid_64
< 1) wid_64
= 1;
886 if (height
< 1) height
= 1;
887 int ext
= (real_width
- (wid_64
<< 3));
890 mov esi
,dword ptr
[src
]
891 mov edi
,dword ptr
[dst
]
893 mov ecx
,dword ptr
[height
]
897 mov ecx
,dword ptr
[wid_64
]
899 mov eax
,dword ptr
[esi
] // read all 4 pixels
907 mov eax
,edx
//intensity
912 mov dword ptr
[edi
],ebx
// save dword
915 mov eax
,dword ptr
[esi
] // read all 4 pixels
923 mov eax
,edx
//intensity
928 mov dword ptr
[edi
],ebx
// save dword
940 add esi
,dword ptr
[line
]
941 add edi
,dword ptr
[ext
]
943 mov ecx
,dword ptr
[wid_64
]
945 mov eax
,dword ptr
[esi
+4] // read both pixels
952 mov eax
,edx
//intensity
957 mov dword ptr
[edi
],ebx
//save dword
960 mov eax
,dword ptr
[esi
] // read both pixels
968 mov eax
,edx
//intensity
973 mov dword ptr
[edi
],ebx
//save dword
980 add esi
,dword ptr
[line
]
981 add edi
,dword ptr
[ext
]
990 //printf("Load8bIA\n");
991 long lTemp
, lHeight
= (long) height
;
994 "mov %[c], %[temp] \n"
996 "mov %[wid_64], %%ecx \n"
998 "mov (%[src]), %%eax \n" // read all 4 pixels
1001 "xor %%ebx, %%ebx \n"
1002 "mov %%eax, %%edx \n"
1003 "shr $4, %%eax \n"//all alpha
1004 "and $0x0F0F0F0F, %%eax \n"
1005 "or %%eax, %%ebx \n"
1006 "mov %%edx, %%eax \n"//intensity
1008 "and $0xF0F0F0F0, %%eax \n"
1009 "or %%eax, %%ebx \n"
1011 "mov %%ebx, (%[dst]) \n" // save dword
1014 "mov (%[src]), %%eax \n" // read all 4 pixels
1017 "xor %%ebx, %%ebx \n"
1018 "mov %%eax, %%edx \n"
1019 "shr $4, %%eax \n"//all alpha
1020 "and $0x0F0F0F0F, %%eax \n"
1021 "or %%eax, %%ebx \n"
1022 "mov %%edx, %%eax \n"//intensity
1024 "and $0xF0F0F0F0, %%eax \n"
1025 "or %%eax, %%ebx \n"
1027 "mov %%ebx, (%[dst]) \n" // save dword
1034 "mov %[temp], %[c] \n"
1037 "mov %[c], %[temp] \n"
1039 "add %[line], %[src] \n"
1040 "add %[ext], %[dst] \n"
1042 "mov %[wid_64], %%ecx \n"
1044 "mov 4(%[src]), %%eax \n" // read both pixels
1046 "xor %%ebx, %%ebx \n"
1047 "mov %%eax, %%edx \n"
1048 "shr $4, %%eax \n"//all alpha
1049 "and $0x0F0F0F0F, %%eax \n"
1050 "or %%eax, %%ebx \n"
1051 "mov %%edx, %%eax \n"//intensity
1053 "and $0xF0F0F0F0, %%eax \n"
1054 "or %%eax, %%ebx \n"
1056 "mov %%ebx, (%[dst]) \n" //save dword
1059 "mov (%[src]), %%eax \n" // read both pixels
1062 "xor %%ebx, %%ebx \n"
1063 "mov %%eax, %%edx \n"
1064 "shr $4, %%eax \n"//all alpha
1065 "and $0x0F0F0F0F, %%eax \n"
1066 "or %%eax, %%ebx \n"
1067 "mov %%edx, %%eax \n"//intensity
1069 "and $0xF0F0F0F0, %%eax \n"
1070 "or %%eax, %%ebx \n"
1072 "mov %%ebx, (%[dst]) \n" //save dword
1079 "add %[line], %[src] \n"
1080 "add %[ext], %[dst] \n"
1082 "mov %[temp], %[c] \n"
1087 : [temp
]"=m"(lTemp
), [src
] "+S"(src
), [dst
] "+D"(dst
), [c
] "+c"(lHeight
)
1088 : [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
1089 : "memory", "cc", "eax", "edx", "ebx"
1092 return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44
;
1095 //****************************************************************
1096 // Size: 1, Format: 4
1100 DWORD
Load8bI (unsigned char * dst
, unsigned char * src
, int wid_64
, int height
, int line
, int real_width
, int tile
)
1102 if (rdp
.tlut_mode
!= 0)
1103 return Load8bCI (dst
, src
, wid_64
, height
, line
, real_width
, tile
);
1105 if (wid_64
< 1) wid_64
= 1;
1106 if (height
< 1) height
= 1;
1107 int ext
= (real_width
- (wid_64
<< 3));
1110 mov esi
,dword ptr
[src
]
1111 mov edi
,dword ptr
[dst
]
1113 mov ecx
,dword ptr
[height
]
1117 mov ecx
,dword ptr
[wid_64
]
1119 mov eax
,dword ptr
[esi
] // read all 4 pixels
1122 mov dword ptr
[edi
],eax
// save dword
1125 mov eax
,dword ptr
[esi
] // read all 4 pixels
1128 mov dword ptr
[edi
],eax
// save dword
1140 add esi
,dword ptr
[line
]
1141 add edi
,dword ptr
[ext
]
1143 mov ecx
,dword ptr
[wid_64
]
1145 mov eax
,dword ptr
[esi
+4] // read both pixels
1147 mov dword ptr
[edi
],eax
//save dword
1150 mov eax
,dword ptr
[esi
] // read both pixels
1153 mov dword ptr
[edi
],eax
//save dword
1160 add esi
,dword ptr
[line
]
1161 add edi
,dword ptr
[ext
]
1170 //printf("Load8bI\n");
1171 long lTemp
, lHeight
= (long) height
;
1174 "mov %[c], %[temp] \n"
1176 "mov %[wid_64], %%ecx \n"
1178 "mov (%[src]), %%eax \n" // read all 4 pixels
1181 "mov %%eax, (%[dst]) \n" // save dword
1184 "mov (%[src]), %%eax \n" // read all 4 pixels
1187 "mov %%eax, (%[dst]) \n" // save dword
1194 "mov %[temp], %[c] \n"
1197 "mov %[c], %[temp] \n"
1199 "add %[line], %[src] \n"
1200 "add %[ext], %[dst] \n"
1202 "mov %[wid_64], %%ecx \n"
1204 "mov 4(%[src]), %%eax \n" // read both pixels
1206 "mov %%eax, (%[dst]) \n" //save dword
1209 "mov (%[src]), %%eax \n" // read both pixels
1212 "mov %%eax, (%[dst]) \n" //save dword
1219 "add %[line], %[src] \n"
1220 "add %[ext], %[dst] \n"
1222 "mov %[temp], %[c] \n"
1227 : [temp
]"=m"(lTemp
), [src
]"+S"(src
), [dst
]"+D"(dst
), [c
]"+c"(lHeight
)
1228 : [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
1229 : "memory", "cc", "eax", "edx", "ebx"
1232 return /*(0 << 16) | */GR_TEXFMT_ALPHA_8
;