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 //****************************************************************
40 DWORD
Load4bCI (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
<< 4)) << 1;
45 unsigned short * pal
= (rdp
.pal_8
+ (rdp
.tiles
[tile
].palette
<< 4));
46 if (rdp
.tlut_mode
== 2)
50 mov ebx
,dword ptr
[pal
]
52 mov esi
,dword ptr
[src
]
53 mov edi
,dword ptr
[dst
]
55 mov ecx
,dword ptr
[height
]
59 mov ecx
,dword ptr
[wid_64
]
63 mov eax
,dword ptr
[esi
] // read all 8 pixels
71 mov cx
,word ptr
[ebx
+eax
]
78 mov cx
,word ptr
[ebx
+eax
]
81 mov dword ptr
[edi
],ecx
89 mov cx
,word ptr
[ebx
+eax
]
96 mov cx
,word ptr
[ebx
+eax
]
99 mov dword ptr
[edi
],ecx
103 // 3rd dword output {
107 mov cx
,word ptr
[ebx
+eax
]
114 mov cx
,word ptr
[ebx
+eax
]
117 mov dword ptr
[edi
],ecx
121 // 4th dword output {
125 mov cx
,word ptr
[ebx
+eax
]
131 mov cx
,word ptr
[ebx
+edx
]
134 mov dword ptr
[edi
],ecx
139 mov eax
,dword ptr
[esi
] // read all 8 pixels
144 // 1st dword output {
147 mov cx
,word ptr
[ebx
+eax
]
154 mov cx
,word ptr
[ebx
+eax
]
157 mov dword ptr
[edi
],ecx
161 // 2nd dword output {
165 mov cx
,word ptr
[ebx
+eax
]
172 mov cx
,word ptr
[ebx
+eax
]
175 mov dword ptr
[edi
],ecx
179 // 3rd dword output {
183 mov cx
,word ptr
[ebx
+eax
]
190 mov cx
,word ptr
[ebx
+eax
]
193 mov dword ptr
[edi
],ecx
197 // 4th dword output {
201 mov cx
,word ptr
[ebx
+eax
]
207 mov cx
,word ptr
[ebx
+edx
]
210 mov dword ptr
[edi
],ecx
225 add esi
,dword ptr
[line
]
226 add edi
,dword ptr
[ext
]
228 mov ecx
,dword ptr
[wid_64
]
232 mov eax
,dword ptr
[esi
+4] // read all 8 pixels
236 // 1st dword output {
239 mov cx
,word ptr
[ebx
+eax
]
246 mov cx
,word ptr
[ebx
+eax
]
249 mov dword ptr
[edi
],ecx
253 // 2nd dword output {
257 mov cx
,word ptr
[ebx
+eax
]
264 mov cx
,word ptr
[ebx
+eax
]
267 mov dword ptr
[edi
],ecx
271 // 3rd dword output {
275 mov cx
,word ptr
[ebx
+eax
]
282 mov cx
,word ptr
[ebx
+eax
]
285 mov dword ptr
[edi
],ecx
289 // 4th dword output {
293 mov cx
,word ptr
[ebx
+eax
]
299 mov cx
,word ptr
[ebx
+edx
]
302 mov dword ptr
[edi
],ecx
307 mov eax
,dword ptr
[esi
] // read all 8 pixels
312 // 1st dword output {
315 mov cx
,word ptr
[ebx
+eax
]
322 mov cx
,word ptr
[ebx
+eax
]
325 mov dword ptr
[edi
],ecx
329 // 2nd dword output {
333 mov cx
,word ptr
[ebx
+eax
]
340 mov cx
,word ptr
[ebx
+eax
]
343 mov dword ptr
[edi
],ecx
347 // 3rd dword output {
351 mov cx
,word ptr
[ebx
+eax
]
358 mov cx
,word ptr
[ebx
+eax
]
361 mov dword ptr
[edi
],ecx
365 // 4th dword output {
369 mov cx
,word ptr
[ebx
+eax
]
375 mov cx
,word ptr
[ebx
+edx
]
378 mov dword ptr
[edi
],ecx
388 add esi
,dword ptr
[line
]
389 add edi
,dword ptr
[ext
]
398 //printf("Load4bCI1\n");
399 // This way, gcc generates either a 32 bit or a 64 bit register
400 intptr_t fake_ecx
, fake_eax
, fake_edx
;
405 "mov %[wid_64], %%ecx \n"
409 "mov (%[src]), %%eax \n" // read all 8 pixels
412 "mov %%eax, %%edx \n"
414 // 1st dword output {
416 "and $0x1E, %%eax \n"
417 "mov (%[pal],%[a]), %%cx \n"
421 "mov %%edx, %%eax \n"
423 "and $0x1E, %%eax \n"
424 "mov (%[pal],%[a]), %%cx \n"
427 "mov %%ecx, (%[dst]) \n"
431 // 2nd dword output {
432 "mov %%edx, %%eax \n"
434 "and $0x1E, %%eax \n"
435 "mov (%[pal],%[a]), %%cx \n"
439 "mov %%edx, %%eax \n"
441 "and $0x1E, %%eax \n"
442 "mov (%[pal],%[a]), %%cx \n"
445 "mov %%ecx, (%[dst]) \n"
449 // 3rd dword output {
450 "mov %%edx, %%eax \n"
452 "and $0x1E, %%eax \n"
453 "mov (%[pal],%[a]),%%cx \n"
457 "mov %%edx, %%eax \n"
459 "and $0x1E, %%eax \n"
460 "mov (%[pal],%[a]), %%cx \n"
463 "mov %%ecx, (%[dst]) \n"
467 // 4th dword output {
468 "mov %%edx, %%eax \n"
470 "and $0x1E, %%eax \n"
471 "mov (%[pal],%[a]), %%cx \n"
476 "and $0x1E, %%edx \n"
477 "mov (%[pal],%[d]), %%cx \n"
480 "mov %%ecx, (%[dst]) \n"
485 "mov (%[src]), %%eax \n" // read all 8 pixels
488 "mov %%eax, %%edx \n"
490 // 1st dword output {
492 "and $0x1E, %%eax \n"
493 "mov (%[pal],%[a]), %%cx \n"
497 "mov %%edx, %%eax \n"
499 "and $0x1E, %%eax \n"
500 "mov (%[pal],%[a]), %%cx \n"
503 "mov %%ecx, (%[dst]) \n"
507 // 2nd dword output {
508 "mov %%edx, %%eax \n"
510 "and $0x1E, %%eax \n"
511 "mov (%[pal],%[a]), %%cx \n"
515 "mov %%edx, %%eax \n"
517 "and $0x1E, %%eax \n"
518 "mov (%[pal],%[a]), %%cx \n"
521 "mov %%ecx, (%[dst]) \n"
525 // 3rd dword output {
526 "mov %%edx, %%eax \n"
528 "and $0x1E, %%eax \n"
529 "mov (%[pal],%[a]), %%cx \n"
533 "mov %%edx, %%eax \n"
535 "and $0x1E, %%eax \n"
536 "mov (%[pal],%[a]), %%cx \n"
539 "mov %%ecx, (%[dst]) \n"
543 // 4th dword output {
544 "mov %%edx, %%eax \n"
546 "and $0x1E, %%eax \n"
547 "mov (%[pal],%[a]), %%cx \n"
552 "and $0x1E, %%edx \n"
553 "mov (%[pal],%[d]), %%cx \n"
556 "mov %%ecx, (%[dst]) \n"
571 "add %[line], %[src] \n"
572 "add %[ext], %[dst] \n"
574 "mov %[wid_64], %%ecx \n"
578 "mov 4(%[src]), %%eax \n" // read all 8 pixels
580 "mov %%eax, %%edx \n"
582 // 1st dword output {
584 "and $0x1E, %%eax \n"
585 "mov (%[pal],%[a]), %%cx \n"
589 "mov %%edx, %%eax \n"
591 "and $0x1E, %%eax \n"
592 "mov (%[pal],%[a]), %%cx \n"
595 "mov %%ecx, (%[dst]) \n"
599 // 2nd dword output {
600 "mov %%edx, %%eax \n"
602 "and $0x1E, %%eax \n"
603 "mov (%[pal],%[a]), %%cx \n"
607 "mov %%edx, %%eax \n"
609 "and $0x1E, %%eax \n"
610 "mov (%[pal],%[a]), %%cx \n"
613 "mov %%ecx, (%[dst]) \n"
617 // 3rd dword output {
618 "mov %%edx, %%eax \n"
620 "and $0x1E, %%eax \n"
621 "mov (%[pal],%[a]), %%cx \n"
625 "mov %%edx, %%eax \n"
627 "and $0x1E, %%eax \n"
628 "mov (%[pal],%[a]), %%cx \n"
631 "mov %%ecx, (%[dst]) \n"
635 // 4th dword output {
636 "mov %%edx, %%eax \n"
638 "and $0x1E, %%eax \n"
639 "mov (%[pal],%[a]), %%cx \n"
644 "and $0x1E, %%edx \n"
645 "mov (%[pal],%[d]), %%cx \n"
648 "mov %%ecx, (%[dst]) \n"
653 "mov (%[src]), %%eax \n" // read all 8 pixels
656 "mov %%eax, %%edx \n"
658 // 1st dword output {
660 "and $0x1E, %%eax \n"
661 "mov (%[pal],%[a]), %%cx \n"
665 "mov %%edx, %%eax \n"
667 "and $0x1E, %%eax \n"
668 "mov (%[pal],%[a]), %%cx \n"
671 "mov %%ecx, (%[dst]) \n"
675 // 2nd dword output {
676 "mov %%edx, %%eax \n"
678 "and $0x1E, %%eax \n"
679 "mov (%[pal],%[a]), %%cx \n"
683 "mov %%edx, %%eax \n"
685 "and $0x1E, %%eax \n"
686 "mov (%[pal],%[a]), %%cx \n"
689 "mov %%ecx, (%[dst]) \n"
693 // 3rd dword output {
694 "mov %%edx, %%eax \n"
696 "and $0x1E, %%eax \n"
697 "mov (%[pal],%[a]), %%cx \n"
701 "mov %%edx, %%eax \n"
703 "and $0x1E, %%eax \n"
704 "mov (%[pal],%[a]), %%cx \n"
707 "mov %%ecx, (%[dst]) \n"
711 // 4th dword output {
712 "mov %%edx, %%eax \n"
714 "and $0x1E, %%eax \n"
715 "mov (%[pal],%[a]), %%cx \n"
720 "and $0x1E, %%edx \n"
721 "mov (%[pal],%[d]), %%cx \n"
724 "mov %%ecx, (%[dst]) \n"
734 "add %[line], %[src] \n"
735 "add %[ext], %[dst] \n"
742 : [c
] "=&c" (fake_ecx
), [a
] "=&a" (fake_eax
), [d
] "=&d" (fake_edx
)
743 : [src
] "S"(src
), [dst
] "D"(dst
), "[c]"(height
),
744 // pal needs to be in a register because its used in mov (%[pal],...), ...
745 [pal
] "r" (pal
), [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
754 mov ebx
,dword ptr
[pal
]
756 mov esi
,dword ptr
[src
]
757 mov edi
,dword ptr
[dst
]
759 mov ecx
,dword ptr
[height
]
763 mov ecx
,dword ptr
[wid_64
]
767 mov eax
,dword ptr
[esi
] // read all 8 pixels
772 // 1st dword output {
775 mov cx
,word ptr
[ebx
+eax
]
782 mov cx
,word ptr
[ebx
+eax
]
785 mov dword ptr
[edi
],ecx
789 // 2nd dword output {
793 mov cx
,word ptr
[ebx
+eax
]
800 mov cx
,word ptr
[ebx
+eax
]
803 mov dword ptr
[edi
],ecx
807 // 3rd dword output {
811 mov cx
,word ptr
[ebx
+eax
]
818 mov cx
,word ptr
[ebx
+eax
]
821 mov dword ptr
[edi
],ecx
825 // 4th dword output {
829 mov cx
,word ptr
[ebx
+eax
]
835 mov cx
,word ptr
[ebx
+edx
]
838 mov dword ptr
[edi
],ecx
843 mov eax
,dword ptr
[esi
] // read all 8 pixels
848 // 1st dword output {
851 mov cx
,word ptr
[ebx
+eax
]
858 mov cx
,word ptr
[ebx
+eax
]
861 mov dword ptr
[edi
],ecx
865 // 2nd dword output {
869 mov cx
,word ptr
[ebx
+eax
]
876 mov cx
,word ptr
[ebx
+eax
]
879 mov dword ptr
[edi
],ecx
883 // 3rd dword output {
887 mov cx
,word ptr
[ebx
+eax
]
894 mov cx
,word ptr
[ebx
+eax
]
897 mov dword ptr
[edi
],ecx
901 // 4th dword output {
905 mov cx
,word ptr
[ebx
+eax
]
911 mov cx
,word ptr
[ebx
+edx
]
914 mov dword ptr
[edi
],ecx
929 add esi
,dword ptr
[line
]
930 add edi
,dword ptr
[ext
]
932 mov ecx
,dword ptr
[wid_64
]
936 mov eax
,dword ptr
[esi
+4] // read all 8 pixels
940 // 1st dword output {
943 mov cx
,word ptr
[ebx
+eax
]
950 mov cx
,word ptr
[ebx
+eax
]
953 mov dword ptr
[edi
],ecx
957 // 2nd dword output {
961 mov cx
,word ptr
[ebx
+eax
]
968 mov cx
,word ptr
[ebx
+eax
]
971 mov dword ptr
[edi
],ecx
975 // 3rd dword output {
979 mov cx
,word ptr
[ebx
+eax
]
986 mov cx
,word ptr
[ebx
+eax
]
989 mov dword ptr
[edi
],ecx
993 // 4th dword output {
997 mov cx
,word ptr
[ebx
+eax
]
1003 mov cx
,word ptr
[ebx
+edx
]
1006 mov dword ptr
[edi
],ecx
1011 mov eax
,dword ptr
[esi
] // read all 8 pixels
1016 // 1st dword output {
1019 mov cx
,word ptr
[ebx
+eax
]
1026 mov cx
,word ptr
[ebx
+eax
]
1029 mov dword ptr
[edi
],ecx
1033 // 2nd dword output {
1037 mov cx
,word ptr
[ebx
+eax
]
1044 mov cx
,word ptr
[ebx
+eax
]
1047 mov dword ptr
[edi
],ecx
1051 // 3rd dword output {
1055 mov cx
,word ptr
[ebx
+eax
]
1062 mov cx
,word ptr
[ebx
+eax
]
1065 mov dword ptr
[edi
],ecx
1069 // 4th dword output {
1073 mov cx
,word ptr
[ebx
+eax
]
1079 mov cx
,word ptr
[ebx
+edx
]
1082 mov dword ptr
[edi
],ecx
1092 add esi
,dword ptr
[line
]
1093 add edi
,dword ptr
[ext
]
1102 //printf("Load4bCI2\n");
1103 intptr_t fake_ecx
, fake_eax
, fake_edx
;
1108 "mov %[wid_64], %%ecx \n"
1112 "mov (%[src]), %%eax \n" // read all 8 pixels
1115 "mov %%eax, %%edx \n"
1117 // 1st dword output {
1119 "and $0x1E, %%eax \n"
1120 "mov (%[pal],%[a]), %%cx \n"
1124 "mov %%edx, %%eax \n"
1126 "and $0x1E, %%eax \n"
1127 "mov (%[pal],%[a]), %%cx \n"
1130 "mov %%ecx, (%[dst]) \n"
1134 // 2nd dword output {
1135 "mov %%edx, %%eax \n"
1137 "and $0x1E, %%eax \n"
1138 "mov (%[pal],%[a]), %%cx \n"
1142 "mov %%edx, %%eax \n"
1144 "and $0x1E, %%eax \n"
1145 "mov (%[pal],%[a]), %%cx \n"
1148 "mov %%ecx, (%[dst]) \n"
1152 // 3rd dword output {
1153 "mov %%edx, %%eax \n"
1155 "and $0x1E, %%eax \n"
1156 "mov (%[pal],%[a]), %%cx \n"
1160 "mov %%edx, %%eax \n"
1162 "and $0x1E, %%eax \n"
1163 "mov (%[pal],%[a]), %%cx \n"
1166 "mov %%ecx, (%[dst]) \n"
1170 // 4th dword output {
1171 "mov %%edx, %%eax \n"
1173 "and $0x1E, %%eax \n"
1174 "mov (%[pal],%[a]), %%cx \n"
1179 "and $0x1E, %%edx \n"
1180 "mov (%[pal],%[d]), %%cx \n"
1183 "mov %%ecx, (%[dst]) \n"
1188 "mov (%[src]), %%eax \n" // read all 8 pixels
1191 "mov %%eax, %%edx \n"
1193 // 1st dword output {
1195 "and $0x1E, %%eax \n"
1196 "mov (%[pal],%[a]), %%cx \n"
1200 "mov %%edx, %%eax \n"
1202 "and $0x1E, %%eax \n"
1203 "mov (%[pal],%[a]), %%cx \n"
1206 "mov %%ecx, (%[dst]) \n"
1210 // 2nd dword output {
1211 "mov %%edx, %%eax \n"
1213 "and $0x1E, %%eax \n"
1214 "mov (%[pal],%[a]), %%cx \n"
1218 "mov %%edx, %%eax \n"
1220 "and $0x1E, %%eax \n"
1221 "mov (%[pal],%[a]), %%cx \n"
1224 "mov %%ecx, (%[dst]) \n"
1228 // 3rd dword output {
1229 "mov %%edx, %%eax \n"
1231 "and $0x1E, %%eax \n"
1232 "mov (%[pal],%[a]), %%cx \n"
1236 "mov %%edx, %%eax \n"
1238 "and $0x1E, %%eax \n"
1239 "mov (%[pal],%[a]), %%cx \n"
1242 "mov %%ecx, (%[dst]) \n"
1246 // 4th dword output {
1247 "mov %%edx, %%eax \n"
1249 "and $0x1E, %%eax \n"
1250 "mov (%[pal],%[a]), %%cx \n"
1255 "and $0x1E, %%edx \n"
1256 "mov (%[pal],%[d]), %%cx \n"
1259 "mov %%ecx, (%[dst]) \n"
1271 "jz ia_end_y_loop \n"
1274 "add %[line], %[src] \n"
1275 "add %[ext], %[dst] \n"
1277 "mov %[wid_64], %%ecx \n"
1281 "mov 4(%[src]), %%eax \n" // read all 8 pixels
1283 "mov %%eax, %%edx \n"
1285 // 1st dword output {
1287 "and $0x1E, %%eax \n"
1288 "mov (%[pal],%[a]), %%cx \n"
1292 "mov %%edx, %%eax \n"
1294 "and $0x1E, %%eax \n"
1295 "mov (%[pal],%[a]), %%cx \n"
1298 "mov %%ecx, (%[dst]) \n"
1302 // 2nd dword output {
1303 "mov %%edx, %%eax \n"
1305 "and $0x1E, %%eax \n"
1306 "mov (%[pal],%[a]), %%cx \n"
1310 "mov %%edx, %%eax \n"
1312 "and $0x1E, %%eax \n"
1313 "mov (%[pal],%[a]), %%cx \n"
1316 "mov %%ecx, (%[dst]) \n"
1320 // 3rd dword output {
1321 "mov %%edx, %%eax \n"
1323 "and $0x1E, %%eax \n"
1324 "mov (%[pal],%[a]), %%cx \n"
1328 "mov %%edx, %%eax \n"
1330 "and $0x1E, %%eax \n"
1331 "mov (%[pal],%[a]), %%cx \n"
1334 "mov %%ecx, (%[dst]) \n"
1338 // 4th dword output {
1339 "mov %%edx, %%eax \n"
1341 "and $0x1E, %%eax \n"
1342 "mov (%[pal],%[a]), %%cx \n"
1347 "and $0x1E, %%edx \n"
1348 "mov (%[pal],%[d]), %%cx \n"
1351 "mov %%ecx, (%[dst]) \n"
1356 "mov (%[src]), %%eax \n" // read all 8 pixels
1359 "mov %%eax, %%edx \n"
1361 // 1st dword output {
1363 "and $0x1E, %%eax \n"
1364 "mov (%[pal],%[a]), %%cx \n"
1368 "mov %%edx, %%eax \n"
1370 "and $0x1E, %%eax \n"
1371 "mov (%[pal],%[a]), %%cx \n"
1374 "mov %%ecx, (%[dst]) \n"
1378 // 2nd dword output {
1379 "mov %%edx, %%eax \n"
1381 "and $0x1E, %%eax \n"
1382 "mov (%[pal],%[a]), %%cx \n"
1386 "mov %%edx, %%eax \n"
1388 "and $0x1E, %%eax \n"
1389 "mov (%[pal],%[a]), %%cx \n"
1392 "mov %%ecx, (%[dst]) \n"
1396 // 3rd dword output {
1397 "mov %%edx, %%eax \n"
1399 "and $0x1E, %%eax \n"
1400 "mov (%[pal],%[a]), %%cx \n"
1404 "mov %%edx, %%eax \n"
1406 "and $0x1E, %%eax \n"
1407 "mov (%[pal],%[a]), %%cx \n"
1410 "mov %%ecx, (%[dst]) \n"
1414 // 4th dword output {
1415 "mov %%edx, %%eax \n"
1417 "and $0x1E, %%eax \n"
1418 "mov (%[pal],%[a]), %%cx \n"
1423 "and $0x1E, %%edx \n"
1424 "mov (%[pal],%[d]), %%cx \n"
1427 "mov %%ecx, (%[dst]) \n"
1435 "jnz ia_x_loop_2 \n"
1437 "add %[line], %[src] \n"
1438 "add %[ext], %[dst] \n"
1445 : [c
] "=&c" (fake_ecx
), [a
] "=&a" (fake_eax
), [d
] "=&d" (fake_edx
)
1446 : [src
]"S"(src
), [dst
]"D"(dst
), "[c]"(height
),
1447 // pal needs to be in a register because its used in mov (%[pal],...), ...
1448 [pal
] "r" (pal
), [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
1452 return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88
;
1455 return (1 << 16) | GR_TEXFMT_ARGB_1555
;
1458 //****************************************************************
1459 // Size: 0, Format: 3
1463 DWORD
Load4bIA (unsigned char * dst
, unsigned char * src
, int wid_64
, int height
, int line
, int real_width
, int tile
)
1465 if (rdp
.tlut_mode
!= 0)
1466 return Load4bCI (dst
, src
, wid_64
, height
, line
, real_width
, tile
);
1468 if (wid_64
< 1) wid_64
= 1;
1469 if (height
< 1) height
= 1;
1470 int ext
= (real_width
- (wid_64
<< 4));
1473 mov esi
,dword ptr
[src
]
1474 mov edi
,dword ptr
[dst
]
1476 mov ecx
,dword ptr
[height
]
1480 mov ecx
,dword ptr
[wid_64
]
1484 mov eax
,dword ptr
[esi
] // read all 8 pixels
1493 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1494 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
1506 shr eax
,28 // Intensity
1513 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
1514 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
1526 shr eax
,16 // Intensity
1534 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
1535 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
1547 shr eax
,4 // Intensity
1555 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
1556 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
1568 shl eax
,8 // Intensity
1576 mov dword ptr
[edi
],ecx
1584 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
1585 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
1597 shr eax
,12 // Intensity
1604 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
1605 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
1617 mov eax
,edx
// Intensity
1625 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
1626 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
1639 shl eax
,12 // Intensity
1647 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
1648 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
1660 shl eax
,24 // Intensity
1667 mov dword ptr
[edi
],ecx
1672 mov eax
,dword ptr
[esi
] // read all 8 pixels
1681 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1682 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
1694 shr eax
,28 // Intensity
1701 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
1702 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
1714 shr eax
,16 // Intensity
1722 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
1723 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
1735 shr eax
,4 // Intensity
1743 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
1744 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
1756 shl eax
,8 // Intensity
1764 mov dword ptr
[edi
],ecx
1772 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
1773 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
1785 shr eax
,12 // Intensity
1792 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
1793 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
1805 mov eax
,edx
// Intensity
1813 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
1814 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
1827 shl eax
,12 // Intensity
1835 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
1836 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
1848 shl eax
,24 // Intensity
1855 mov dword ptr
[edi
],ecx
1870 add esi
,dword ptr
[line
]
1871 add edi
,dword ptr
[ext
]
1873 mov ecx
,dword ptr
[wid_64
]
1877 mov eax
,dword ptr
[esi
+4] // read all 8 pixels
1885 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1886 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
1898 shr eax
,28 // Intensity
1905 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
1906 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
1918 shr eax
,16 // Intensity
1926 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
1927 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
1939 shr eax
,4 // Intensity
1947 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
1948 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
1960 shl eax
,8 // Intensity
1968 mov dword ptr
[edi
],ecx
1976 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
1977 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
1989 shr eax
,12 // Intensity
1996 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
1997 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2009 mov eax
,edx
// Intensity
2017 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
2018 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2031 shl eax
,12 // Intensity
2039 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
2040 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2052 shl eax
,24 // Intensity
2059 mov dword ptr
[edi
],ecx
2064 mov eax
,dword ptr
[esi
] // read all 8 pixels
2073 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2074 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2086 shr eax
,28 // Intensity
2093 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
2094 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2106 shr eax
,16 // Intensity
2114 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
2115 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2127 shr eax
,4 // Intensity
2135 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
2136 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2148 shl eax
,8 // Intensity
2156 mov dword ptr
[edi
],ecx
2164 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
2165 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2177 shr eax
,12 // Intensity
2184 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
2185 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2197 mov eax
,edx
// Intensity
2205 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
2206 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2219 shl eax
,12 // Intensity
2227 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
2228 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2240 shl eax
,24 // Intensity
2247 mov dword ptr
[edi
],ecx
2256 add esi
,dword ptr
[line
]
2257 add edi
,dword ptr
[ext
]
2266 //printf("Load4bIA\n");
2272 "mov %[wid_64], %%ecx \n"
2276 "mov (%[src]), %%eax \n" // read all 8 pixels
2279 "mov %%eax, %%edx \n"
2282 "xor %%ecx, %%ecx \n"
2285 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2286 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2287 "mov %%edx, %%eax \n"
2288 "shr $24, %%eax \n" //Alpha
2289 "and $0x00000010, %%eax \n"
2290 "or %%eax, %%ecx \n"
2292 "or %%eax, %%ecx \n"
2294 "or %%eax, %%ecx \n"
2296 "or %%eax, %%ecx \n"
2297 "mov %%edx, %%eax \n"
2298 "shr $28, %%eax \n" // Intensity
2299 "and $0x0000000E, %%eax \n"
2300 "or %%eax, %%ecx \n"
2302 "or %%eax, %%ecx \n"
2305 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
2306 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2307 "mov %%edx, %%eax \n"
2308 "shr $12, %%eax \n" //Alpha
2309 "and $0x00001000, %%eax \n"
2310 "or %%eax, %%ecx \n"
2312 "or %%eax, %%ecx \n"
2314 "or %%eax, %%ecx \n"
2316 "or %%eax, %%ecx \n"
2317 "mov %%edx, %%eax \n"
2318 "shr $16, %%eax \n" // Intensity
2319 "and $0x00000E00, %%eax \n"
2320 "or %%eax, %%ecx \n"
2322 "and $0x00000100, %%eax \n"
2323 "or %%eax, %%ecx \n"
2326 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
2327 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2329 "mov %%edx, %%eax \n"
2330 "and $0x00100000, %%eax \n"
2331 "or %%eax, %%ecx \n"
2333 "or %%eax, %%ecx \n"
2335 "or %%eax, %%ecx \n"
2337 "or %%eax, %%ecx \n"
2338 "mov %%edx, %%eax \n"
2339 "shr $4, %%eax \n" // Intensity
2340 "and $0x000E0000, %%eax \n"
2341 "or %%eax, %%ecx \n"
2343 "and $0x00010000, %%eax \n"
2344 "or %%eax, %%ecx \n"
2347 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
2348 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2349 "mov %%edx, %%eax \n"
2350 "shl $12, %%eax \n" //Alpha
2351 "and $0x10000000, %%eax \n"
2352 "or %%eax, %%ecx \n"
2354 "or %%eax, %%ecx \n"
2356 "or %%eax, %%ecx \n"
2358 "or %%eax, %%ecx \n"
2359 "mov %%edx, %%eax \n"
2360 "shl $8, %%eax \n" // Intensity
2361 "and $0x0E000000, %%eax \n"
2362 "or %%eax, %%ecx \n"
2364 "and $0x01000000, %%eax \n"
2365 "or %%eax, %%ecx \n"
2368 "mov %%ecx, (%[dst]) \n"
2373 "xor %%ecx, %%ecx \n"
2376 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
2377 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2378 "mov %%edx, %%eax \n"
2379 "shr $8, %%eax \n" //Alpha
2380 "and $0x00000010, %%eax \n"
2381 "or %%eax, %%ecx \n"
2383 "or %%eax, %%ecx \n"
2385 "or %%eax, %%ecx \n"
2387 "or %%eax, %%ecx \n"
2388 "mov %%edx, %%eax \n"
2389 "shr $12, %%eax \n" // Intensity
2390 "and $0x0000000E, %%eax \n"
2391 "or %%eax, %%ecx \n"
2393 "or %%eax, %%ecx \n"
2396 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
2397 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2399 "mov %%edx, %%eax \n"
2401 "and $0x00001000, %%eax \n"
2402 "or %%eax, %%ecx \n"
2404 "or %%eax, %%ecx \n"
2406 "or %%eax, %%ecx \n"
2408 "or %%eax, %%ecx \n"
2409 "mov %%edx, %%eax \n" // Intensity
2410 "and $0x00000E00, %%eax \n"
2411 "or %%eax, %%ecx \n"
2413 "and $0x00000100, %%eax \n"
2414 "or %%eax, %%ecx \n"
2417 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
2418 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2420 "mov %%edx, %%eax \n"
2422 "and $0x00100000, %%eax \n"
2423 "or %%eax, %%ecx \n"
2425 "or %%eax, %%ecx \n"
2427 "or %%eax, %%ecx \n"
2429 "or %%eax, %%ecx \n"
2430 "mov %%edx, %%eax \n"
2431 "shl $12, %%eax \n" // Intensity
2432 "and $0x000E0000, %%eax \n"
2433 "or %%eax, %%ecx \n"
2435 "and $0x00010000, %%eax \n"
2436 "or %%eax, %%ecx \n"
2439 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
2440 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2441 "mov %%edx, %%eax \n"
2442 "shl $28, %%eax \n" //Alpha
2443 "and $0x10000000, %%eax \n"
2444 "or %%eax, %%ecx \n"
2446 "or %%eax, %%ecx \n"
2448 "or %%eax, %%ecx \n"
2450 "or %%eax, %%ecx \n"
2451 "mov %%edx, %%eax \n"
2452 "shl $24, %%eax \n" // Intensity
2453 "and $0x0E000000, %%eax \n"
2454 "or %%eax, %%ecx \n"
2456 "and $0x01000000, %%eax \n"
2457 "or %%eax, %%ecx \n"
2459 "mov %%ecx, (%[dst]) \n"
2464 "mov (%[src]), %%eax \n" // read all 8 pixels
2467 "mov %%eax, %%edx \n"
2470 "xor %%ecx, %%ecx \n"
2473 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2474 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2475 "mov %%edx, %%eax \n"
2476 "shr $24, %%eax \n" //Alpha
2477 "and $0x00000010, %%eax \n"
2478 "or %%eax, %%ecx \n"
2480 "or %%eax, %%ecx \n"
2482 "or %%eax, %%ecx \n"
2484 "or %%eax, %%ecx \n"
2485 "mov %%edx, %%eax \n"
2486 "shr $28, %%eax \n" // Intensity
2487 "and $0x0000000E, %%eax \n"
2488 "or %%eax, %%ecx \n"
2490 "or %%eax, %%ecx \n"
2493 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
2494 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2495 "mov %%edx, %%eax \n"
2496 "shr $12, %%eax \n" //Alpha
2497 "and $0x00001000, %%eax \n"
2498 "or %%eax, %%ecx \n"
2500 "or %%eax, %%ecx \n"
2502 "or %%eax, %%ecx \n"
2504 "or %%eax, %%ecx \n"
2505 "mov %%edx, %%eax \n"
2506 "shr $16, %%eax \n" // Intensity
2507 "and $0x00000E00, %%eax \n"
2508 "or %%eax, %%ecx \n"
2510 "and $0x00000100, %%eax \n"
2511 "or %%eax, %%ecx \n"
2514 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
2515 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2517 "mov %%edx, %%eax \n"
2518 "and $0x00100000, %%eax \n"
2519 "or %%eax, %%ecx \n"
2521 "or %%eax, %%ecx \n"
2523 "or %%eax, %%ecx \n"
2525 "or %%eax, %%ecx \n"
2526 "mov %%edx, %%eax \n"
2527 "shr $4, %%eax \n" // Intensity
2528 "and $0x000E0000, %%eax \n"
2529 "or %%eax, %%ecx \n"
2531 "and $0x00010000, %%eax \n"
2532 "or %%eax, %%ecx \n"
2535 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
2536 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2537 "mov %%edx, %%eax \n"
2538 "shl $12, %%eax \n" //Alpha
2539 "and $0x10000000, %%eax \n"
2540 "or %%eax, %%ecx \n"
2542 "or %%eax, %%ecx \n"
2544 "or %%eax, %%ecx \n"
2546 "or %%eax, %%ecx \n"
2547 "mov %%edx, %%eax \n"
2548 "shl $8, %%eax \n" // Intensity
2549 "and $0x0E000000, %%eax \n"
2550 "or %%eax, %%ecx \n"
2552 "and $0x01000000, %%eax \n"
2553 "or %%eax, %%ecx \n"
2556 "mov %%ecx, (%[dst]) \n"
2561 "xor %%ecx, %%ecx \n"
2564 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
2565 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2566 "mov %%edx, %%eax \n"
2567 "shr $8, %%eax \n" //Alpha
2568 "and $0x00000010, %%eax \n"
2569 "or %%eax, %%ecx \n"
2571 "or %%eax, %%ecx \n"
2573 "or %%eax, %%ecx \n"
2575 "or %%eax, %%ecx \n"
2576 "mov %%edx, %%eax \n"
2577 "shr $12, %%eax \n" // Intensity
2578 "and $0x0000000E, %%eax \n"
2579 "or %%eax, %%ecx \n"
2581 "or %%eax, %%ecx \n"
2584 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
2585 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2587 "mov %%edx, %%eax \n"
2589 "and $0x00001000, %%eax \n"
2590 "or %%eax, %%ecx \n"
2592 "or %%eax, %%ecx \n"
2594 "or %%eax, %%ecx \n"
2596 "or %%eax, %%ecx \n"
2597 "mov %%edx, %%eax \n" // Intensity
2598 "and $0x00000E00, %%eax \n"
2599 "or %%eax, %%ecx \n"
2601 "and $0x00000100, %%eax \n"
2602 "or %%eax, %%ecx \n"
2605 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
2606 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2608 "mov %%edx, %%eax \n"
2610 "and $0x00100000, %%eax \n"
2611 "or %%eax, %%ecx \n"
2613 "or %%eax, %%ecx \n"
2615 "or %%eax, %%ecx \n"
2617 "or %%eax, %%ecx \n"
2618 "mov %%edx, %%eax \n"
2619 "shl $12, %%eax \n" // Intensity
2620 "and $0x000E0000, %%eax \n"
2621 "or %%eax, %%ecx \n"
2623 "and $0x00010000, %%eax \n"
2624 "or %%eax, %%ecx \n"
2627 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
2628 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2629 "mov %%edx, %%eax \n"
2630 "shl $28, %%eax \n" //Alpha
2631 "and $0x10000000, %%eax \n"
2632 "or %%eax, %%ecx \n"
2634 "or %%eax, %%ecx \n"
2636 "or %%eax, %%ecx \n"
2638 "or %%eax, %%ecx \n"
2639 "mov %%edx, %%eax \n"
2640 "shl $24, %%eax \n" // Intensity
2641 "and $0x0E000000, %%eax \n"
2642 "or %%eax, %%ecx \n"
2644 "and $0x01000000, %%eax \n"
2645 "or %%eax, %%ecx \n"
2647 "mov %%ecx, (%[dst]) \n"
2662 "add %[line], %[src] \n"
2663 "add %[ext], %[dst] \n"
2665 "mov %[wid_64], %%ecx \n"
2669 "mov 4(%[src]), %%eax \n" // read all 8 pixels
2671 "mov %%eax, %%edx \n"
2674 "xor %%ecx, %%ecx \n"
2677 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2678 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2679 "mov %%edx, %%eax \n"
2680 "shr $24, %%eax \n" //Alpha
2681 "and $0x00000010, %%eax \n"
2682 "or %%eax, %%ecx \n"
2684 "or %%eax, %%ecx \n"
2686 "or %%eax, %%ecx \n"
2688 "or %%eax, %%ecx \n"
2689 "mov %%edx, %%eax \n"
2690 "shr $28, %%eax \n" // Intensity
2691 "and $0x0000000E, %%eax \n"
2692 "or %%eax, %%ecx \n"
2694 "or %%eax, %%ecx \n"
2697 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
2698 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2699 "mov %%edx, %%eax \n"
2700 "shr $12, %%eax \n" //Alpha
2701 "and $0x00001000, %%eax \n"
2702 "or %%eax, %%ecx \n"
2704 "or %%eax, %%ecx \n"
2706 "or %%eax, %%ecx \n"
2708 "or %%eax, %%ecx \n"
2709 "mov %%edx, %%eax \n"
2710 "shr $16, %%eax \n" // Intensity
2711 "and $0x00000E00, %%eax \n"
2712 "or %%eax, %%ecx \n"
2714 "and $0x00000100, %%eax \n"
2715 "or %%eax, %%ecx \n"
2718 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
2719 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2721 "mov %%edx, %%eax \n"
2722 "and $0x00100000, %%eax \n"
2723 "or %%eax, %%ecx \n"
2725 "or %%eax, %%ecx \n"
2727 "or %%eax, %%ecx \n"
2729 "or %%eax, %%ecx \n"
2730 "mov %%edx, %%eax \n"
2731 "shr $4, %%eax \n" // Intensity
2732 "and $0x000E0000, %%eax \n"
2733 "or %%eax, %%ecx \n"
2735 "and $0x00010000, %%eax \n"
2736 "or %%eax, %%ecx \n"
2739 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
2740 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2741 "mov %%edx, %%eax \n"
2742 "shl $12, %%eax \n" //Alpha
2743 "and $0x10000000, %%eax \n"
2744 "or %%eax, %%ecx \n"
2746 "or %%eax, %%ecx \n"
2748 "or %%eax, %%ecx \n"
2750 "or %%eax, %%ecx \n"
2751 "mov %%edx, %%eax \n"
2752 "shl $8, %%eax \n" // Intensity
2753 "and $0x0E000000, %%eax \n"
2754 "or %%eax, %%ecx \n"
2756 "and $0x01000000, %%eax \n"
2757 "or %%eax, %%ecx \n"
2760 "mov %%ecx, (%[dst]) \n"
2765 "xor %%ecx, %%ecx \n"
2768 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
2769 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2770 "mov %%edx, %%eax \n"
2771 "shr $8, %%eax \n" //Alpha
2772 "and $0x00000010, %%eax \n"
2773 "or %%eax, %%ecx \n"
2775 "or %%eax, %%ecx \n"
2777 "or %%eax, %%ecx \n"
2779 "or %%eax, %%ecx \n"
2780 "mov %%edx, %%eax \n"
2781 "shr $12, %%eax \n" // Intensity
2782 "and $0x0000000E, %%eax \n"
2783 "or %%eax, %%ecx \n"
2785 "or %%eax, %%ecx \n"
2788 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
2789 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2791 "mov %%edx, %%eax \n"
2793 "and $0x00001000, %%eax \n"
2794 "or %%eax, %%ecx \n"
2796 "or %%eax, %%ecx \n"
2798 "or %%eax, %%ecx \n"
2800 "or %%eax, %%ecx \n"
2801 "mov %%edx, %%eax \n" // Intensity
2802 "and $0x00000E00, %%eax \n"
2803 "or %%eax, %%ecx \n"
2805 "and $0x00000100, %%eax \n"
2806 "or %%eax, %%ecx \n"
2809 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
2810 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2812 "mov %%edx, %%eax \n"
2814 "and $0x00100000, %%eax \n"
2815 "or %%eax, %%ecx \n"
2817 "or %%eax, %%ecx \n"
2819 "or %%eax, %%ecx \n"
2821 "or %%eax, %%ecx \n"
2822 "mov %%edx, %%eax \n"
2823 "shl $12, %%eax \n" // Intensity
2824 "and $0x000E0000, %%eax \n"
2825 "or %%eax, %%ecx \n"
2827 "and $0x00010000, %%eax \n"
2828 "or %%eax, %%ecx \n"
2831 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
2832 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2833 "mov %%edx, %%eax \n"
2834 "shl $28, %%eax \n" //Alpha
2835 "and $0x10000000, %%eax \n"
2836 "or %%eax, %%ecx \n"
2838 "or %%eax, %%ecx \n"
2840 "or %%eax, %%ecx \n"
2842 "or %%eax, %%ecx \n"
2843 "mov %%edx, %%eax \n"
2844 "shl $24, %%eax \n" // Intensity
2845 "and $0x0E000000, %%eax \n"
2846 "or %%eax, %%ecx \n"
2848 "and $0x01000000, %%eax \n"
2849 "or %%eax, %%ecx \n"
2851 "mov %%ecx, (%[dst]) \n"
2856 "mov (%[src]), %%eax \n" // read all 8 pixels
2859 "mov %%eax, %%edx \n"
2862 "xor %%ecx, %%ecx \n"
2865 // IIIAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2866 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2867 "mov %%edx, %%eax \n"
2868 "shr $24, %%eax \n" //Alpha
2869 "and $0x00000010, %%eax \n"
2870 "or %%eax, %%ecx \n"
2872 "or %%eax, %%ecx \n"
2874 "or %%eax, %%ecx \n"
2876 "or %%eax, %%ecx \n"
2877 "mov %%edx, %%eax \n"
2878 "shr $28, %%eax \n" // Intensity
2879 "and $0x0000000E, %%eax \n"
2880 "or %%eax, %%ecx \n"
2882 "or %%eax, %%ecx \n"
2885 // xxxxIIIAxxxxxxxxxxxxxxxxxxxxxxxx
2886 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2887 "mov %%edx, %%eax \n"
2888 "shr $12, %%eax \n" //Alpha
2889 "and $0x00001000, %%eax \n"
2890 "or %%eax, %%ecx \n"
2892 "or %%eax, %%ecx \n"
2894 "or %%eax, %%ecx \n"
2896 "or %%eax, %%ecx \n"
2897 "mov %%edx, %%eax \n"
2898 "shr $16, %%eax \n" // Intensity
2899 "and $0x00000E00, %%eax \n"
2900 "or %%eax, %%ecx \n"
2902 "and $0x00000100, %%eax \n"
2903 "or %%eax, %%ecx \n"
2906 // xxxxxxxxIIIAxxxxxxxxxxxxxxxxxxxx
2907 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
2909 "mov %%edx, %%eax \n"
2910 "and $0x00100000, %%eax \n"
2911 "or %%eax, %%ecx \n"
2913 "or %%eax, %%ecx \n"
2915 "or %%eax, %%ecx \n"
2917 "or %%eax, %%ecx \n"
2918 "mov %%edx, %%eax \n"
2919 "shr $4, %%eax \n" // Intensity
2920 "and $0x000E0000, %%eax \n"
2921 "or %%eax, %%ecx \n"
2923 "and $0x00010000, %%eax \n"
2924 "or %%eax, %%ecx \n"
2927 // xxxxxxxxxxxxIIIAxxxxxxxxxxxxxxxx
2928 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
2929 "mov %%edx, %%eax \n"
2930 "shl $12, %%eax \n" //Alpha
2931 "and $0x10000000, %%eax \n"
2932 "or %%eax, %%ecx \n"
2934 "or %%eax, %%ecx \n"
2936 "or %%eax, %%ecx \n"
2938 "or %%eax, %%ecx \n"
2939 "mov %%edx, %%eax \n"
2940 "shl $8, %%eax \n" // Intensity
2941 "and $0x0E000000, %%eax \n"
2942 "or %%eax, %%ecx \n"
2944 "and $0x01000000, %%eax \n"
2945 "or %%eax, %%ecx \n"
2948 "mov %%ecx, (%[dst]) \n"
2953 "xor %%ecx, %%ecx \n"
2956 // xxxxxxxxxxxxxxxxIIIAxxxxxxxxxxxx
2957 // xxxxxxxxxxxxxxxxxxxxxxxxAAAAIIII
2958 "mov %%edx, %%eax \n"
2959 "shr $8, %%eax \n" //Alpha
2960 "and $0x00000010, %%eax \n"
2961 "or %%eax, %%ecx \n"
2963 "or %%eax, %%ecx \n"
2965 "or %%eax, %%ecx \n"
2967 "or %%eax, %%ecx \n"
2968 "mov %%edx, %%eax \n"
2969 "shr $12, %%eax \n" // Intensity
2970 "and $0x0000000E, %%eax \n"
2971 "or %%eax, %%ecx \n"
2973 "or %%eax, %%ecx \n"
2976 // xxxxxxxxxxxxxxxxxxxxIIIAxxxxxxxx
2977 // xxxxxxxxxxxxxxxxAAAAIIIIxxxxxxxx
2979 "mov %%edx, %%eax \n"
2981 "and $0x00001000, %%eax \n"
2982 "or %%eax, %%ecx \n"
2984 "or %%eax, %%ecx \n"
2986 "or %%eax, %%ecx \n"
2988 "or %%eax, %%ecx \n"
2989 "mov %%edx, %%eax \n" // Intensity
2990 "and $0x00000E00, %%eax \n"
2991 "or %%eax, %%ecx \n"
2993 "and $0x00000100, %%eax \n"
2994 "or %%eax, %%ecx \n"
2997 // xxxxxxxxxxxxxxxxxxxxxxxxIIIAxxxx
2998 // xxxxxxxxAAAAIIIIxxxxxxxxxxxxxxxx
3000 "mov %%edx, %%eax \n"
3002 "and $0x00100000, %%eax \n"
3003 "or %%eax, %%ecx \n"
3005 "or %%eax, %%ecx \n"
3007 "or %%eax, %%ecx \n"
3009 "or %%eax, %%ecx \n"
3010 "mov %%edx, %%eax \n"
3011 "shl $12, %%eax \n" // Intensity
3012 "and $0x000E0000, %%eax \n"
3013 "or %%eax, %%ecx \n"
3015 "and $0x00010000, %%eax \n"
3016 "or %%eax, %%ecx \n"
3019 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIA
3020 // AAAAIIIIxxxxxxxxxxxxxxxxxxxxxxxx
3021 "mov %%edx, %%eax \n"
3022 "shl $28, %%eax \n" //Alpha
3023 "and $0x10000000, %%eax \n"
3024 "or %%eax, %%ecx \n"
3026 "or %%eax, %%ecx \n"
3028 "or %%eax, %%ecx \n"
3030 "or %%eax, %%ecx \n"
3031 "mov %%edx, %%eax \n"
3032 "shl $24, %%eax \n" // Intensity
3033 "and $0x0E000000, %%eax \n"
3034 "or %%eax, %%ecx \n"
3036 "and $0x01000000, %%eax \n"
3037 "or %%eax, %%ecx \n"
3039 "mov %%ecx, (%[dst]) \n"
3048 "add %[line], %[src] \n"
3049 "add %[ext], %[dst] \n"
3056 : [c
] "=&c" (fake_ecx
)
3057 : [src
]"S"(src
), [dst
]"D"(dst
), "[c]"(height
),
3058 [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
3059 : "memory", "cc", "eax", "edx", "ebx"
3063 return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44
;
3066 //****************************************************************
3067 // Size: 0, Format: 4
3069 DWORD
Load4bI (unsigned char * dst
, unsigned char * src
, int wid_64
, int height
, int line
, int real_width
, int tile
)
3071 if (rdp
.tlut_mode
!= 0)
3072 return Load4bCI (dst
, src
, wid_64
, height
, line
, real_width
, tile
);
3074 if (wid_64
< 1) wid_64
= 1;
3075 if (height
< 1) height
= 1;
3076 int ext
= (real_width
- (wid_64
<< 4));
3079 mov esi
,dword ptr
[src
]
3080 mov edi
,dword ptr
[dst
]
3082 mov ecx
,dword ptr
[height
]
3086 mov ecx
,dword ptr
[wid_64
]
3090 mov eax
,dword ptr
[esi
] // read all 8 pixels
3097 shr eax
,28 // 0xF0000000 -> 0x0000000F
3102 mov eax
,edx
// 0x0F000000 -> 0x00000F00
3110 shr eax
,4 // 0x00F00000 -> 0x000F0000
3117 shl eax
,8 // 0x000F0000 -> 0x0F000000
3123 mov dword ptr
[edi
],ecx
3130 shr eax
,12 // 0x0000F000 -> 0x0000000F
3136 mov eax
,edx
// 0x00000F00 -> 0x00000F00
3143 shl eax
,12 // 0x000000F0 -> 0x000F0000
3149 shl edx
,24 // 0x0000000F -> 0x0F000000
3155 mov dword ptr
[edi
],ecx
3160 mov eax
,dword ptr
[esi
] // read all 8 pixels
3167 shr eax
,28 // 0xF0000000 -> 0x0000000F
3172 mov eax
,edx
// 0x0F000000 -> 0x00000F00
3180 shr eax
,4 // 0x00F00000 -> 0x000F0000
3187 shl eax
,8 // 0x000F0000 -> 0x0F000000
3193 mov dword ptr
[edi
],ecx
3200 shr eax
,12 // 0x0000F000 -> 0x0000000F
3206 mov eax
,edx
// 0x00000F00 -> 0x00000F00
3213 shl eax
,12 // 0x000000F0 -> 0x000F0000
3219 shl edx
,24 // 0x0000000F -> 0x0F000000
3225 mov dword ptr
[edi
],ecx
3239 add esi
,dword ptr
[line
]
3240 add edi
,dword ptr
[ext
]
3242 mov ecx
,dword ptr
[wid_64
]
3246 mov eax
,dword ptr
[esi
+4] // read all 8 pixels
3252 shr eax
,28 // 0xF0000000 -> 0x0000000F
3257 mov eax
,edx
// 0x0F000000 -> 0x00000F00
3265 shr eax
,4 // 0x00F00000 -> 0x000F0000
3272 shl eax
,8 // 0x000F0000 -> 0x0F000000
3278 mov dword ptr
[edi
],ecx
3285 shr eax
,12 // 0x0000F000 -> 0x0000000F
3291 mov eax
,edx
// 0x00000F00 -> 0x00000F00
3298 shl eax
,12 // 0x000000F0 -> 0x000F0000
3304 shl edx
,24 // 0x0000000F -> 0x0F000000
3310 mov dword ptr
[edi
],ecx
3315 mov eax
,dword ptr
[esi
] // read all 8 pixels
3322 shr eax
,28 // 0xF0000000 -> 0x0000000F
3327 mov eax
,edx
// 0x0F000000 -> 0x00000F00
3335 shr eax
,4 // 0x00F00000 -> 0x000F0000
3342 shl eax
,8 // 0x000F0000 -> 0x0F000000
3348 mov dword ptr
[edi
],ecx
3355 shr eax
,12 // 0x0000F000 -> 0x0000000F
3361 mov eax
,edx
// 0x00000F00 -> 0x00000F00
3368 shl eax
,12 // 0x000000F0 -> 0x000F0000
3374 shl edx
,24 // 0x0000000F -> 0x0F000000
3380 mov dword ptr
[edi
],ecx
3389 add esi
,dword ptr
[line
]
3390 add edi
,dword ptr
[ext
]
3399 //printf("Load4bI\n");
3405 "mov %[wid_64], %%ecx \n"
3409 "mov (%[src]), %%eax \n" // read all 8 pixels
3412 "mov %%eax, %%edx \n"
3415 "xor %%ecx, %%ecx \n"
3416 "shr $28, %%eax \n" // 0xF0000000 -> 0x0000000F
3417 "or %%eax, %%ecx \n"
3419 "or %%eax, %%ecx \n"
3421 "mov %%edx, %%eax \n" // 0x0F000000 -> 0x00000F00
3423 "and $0x00000F00, %%eax \n"
3424 "or %%eax, %%ecx \n"
3426 "or %%eax, %%ecx \n"
3428 "mov %%edx, %%eax \n"
3429 "shr $4, %%eax \n" // 0x00F00000 -> 0x000F0000
3430 "and $0x000F0000, %%eax \n"
3431 "or %%eax, %%ecx \n"
3433 "or %%eax, %%ecx \n"
3435 "mov %%edx, %%eax \n"
3436 "shl $8, %%eax \n" // 0x000F0000 -> 0x0F000000
3437 "and $0x0F000000, %%eax \n"
3438 "or %%eax, %%ecx \n"
3440 "or %%eax, %%ecx \n"
3442 "mov %%ecx, (%[dst]) \n"
3447 "xor %%ecx, %%ecx \n"
3448 "mov %%edx, %%eax \n"
3449 "shr $12, %%eax \n" // 0x0000F000 -> 0x0000000F
3450 "and $0x0000000F, %%eax \n"
3451 "or %%eax, %%ecx \n"
3453 "or %%eax, %%ecx \n"
3455 "mov %%edx, %%eax \n" // 0x00000F00 -> 0x00000F00
3456 "and $0x00000F00, %%eax \n"
3457 "or %%eax, %%ecx \n"
3459 "or %%eax, %%ecx \n"
3461 "mov %%edx, %%eax \n"
3462 "shl $12, %%eax \n" // 0x000000F0 -> 0x000F0000
3463 "and $0x000F0000, %%eax \n"
3464 "or %%eax, %%ecx \n"
3466 "or %%eax, %%ecx \n"
3468 "shl $24, %%edx \n" // 0x0000000F -> 0x0F000000
3469 "and $0x0F000000, %%edx \n"
3470 "or %%edx, %%ecx \n"
3472 "or %%edx, %%ecx \n"
3474 "mov %%ecx, (%[dst]) \n"
3479 "mov (%[src]), %%eax \n" // read all 8 pixels
3482 "mov %%eax, %%edx \n"
3485 "xor %%ecx, %%ecx \n"
3486 "shr $28, %%eax \n" // 0xF0000000 -> 0x0000000F
3487 "or %%eax, %%ecx \n"
3489 "or %%eax, %%ecx \n"
3491 "mov %%edx, %%eax \n" // 0x0F000000 -> 0x00000F00
3493 "and $0x00000F00, %%eax \n"
3494 "or %%eax, %%ecx \n"
3496 "or %%eax, %%ecx \n"
3498 "mov %%edx, %%eax \n"
3499 "shr $4, %%eax \n" // 0x00F00000 -> 0x000F0000
3500 "and $0x000F0000, %%eax \n"
3501 "or %%eax, %%ecx \n"
3503 "or %%eax, %%ecx \n"
3505 "mov %%edx, %%eax \n"
3506 "shl $8, %%eax \n" // 0x000F0000 -> 0x0F000000
3507 "and $0x0F000000, %%eax \n"
3508 "or %%eax, %%ecx \n"
3510 "or %%eax, %%ecx \n"
3512 "mov %%ecx, (%[dst]) \n"
3517 "xor %%ecx, %%ecx \n"
3518 "mov %%edx, %%eax \n"
3519 "shr $12, %%eax \n" // 0x0000F000 -> 0x0000000F
3520 "and $0x0000000F, %%eax \n"
3521 "or %%eax, %%ecx \n"
3523 "or %%eax, %%ecx \n"
3525 "mov %%edx, %%eax \n" // 0x00000F00 -> 0x00000F00
3526 "and $0x00000F00, %%eax \n"
3527 "or %%eax, %%ecx \n"
3529 "or %%eax, %%ecx \n"
3531 "mov %%edx, %%eax \n"
3532 "shl $12, %%eax \n" // 0x000000F0 -> 0x000F0000
3533 "and $0x000F0000, %%eax \n"
3534 "or %%eax, %%ecx \n"
3536 "or %%eax, %%ecx \n"
3538 "shl $24, %%edx \n" // 0x0000000F -> 0x0F000000
3539 "and $0x0F000000, %%edx \n"
3540 "or %%edx, %%ecx \n"
3542 "or %%edx, %%ecx \n"
3544 "mov %%ecx, (%[dst]) \n"
3558 "add %[line], %[src] \n"
3559 "add %[ext], %[dst] \n"
3561 "mov %[wid_64], %%ecx \n"
3565 "mov 4(%[src]), %%eax \n" // read all 8 pixels
3567 "mov %%eax, %%edx \n"
3570 "xor %%ecx, %%ecx \n"
3571 "shr $28, %%eax \n" // 0xF0000000 -> 0x0000000F
3572 "or %%eax, %%ecx \n"
3574 "or %%eax, %%ecx \n"
3576 "mov %%edx, %%eax \n" // 0x0F000000 -> 0x00000F00
3578 "and $0x00000F00, %%eax \n"
3579 "or %%eax, %%ecx \n"
3581 "or %%eax, %%ecx \n"
3583 "mov %%edx, %%eax \n"
3584 "shr $4, %%eax \n" // 0x00F00000 -> 0x000F0000
3585 "and $0x000F0000, %%eax \n"
3586 "or %%eax, %%ecx \n"
3588 "or %%eax, %%ecx \n"
3590 "mov %%edx, %%eax \n"
3591 "shl $8, %%eax \n" // 0x000F0000 -> 0x0F000000
3592 "and $0x0F000000, %%eax \n"
3593 "or %%eax, %%ecx \n"
3595 "or %%eax, %%ecx \n"
3597 "mov %%ecx, (%[dst]) \n"
3602 "xor %%ecx, %%ecx \n"
3603 "mov %%edx, %%eax \n"
3604 "shr $12, %%eax \n" // 0x0000F000 -> 0x0000000F
3605 "and $0x0000000F, %%eax \n"
3606 "or %%eax, %%ecx \n"
3608 "or %%eax, %%ecx \n"
3610 "mov %%edx, %%eax \n" // 0x00000F00 -> 0x00000F00
3611 "and $0x00000F00, %%eax \n"
3612 "or %%eax, %%ecx \n"
3614 "or %%eax, %%ecx \n"
3616 "mov %%edx, %%eax \n"
3617 "shl $12, %%eax \n" // 0x000000F0 -> 0x000F0000
3618 "and $0x000F0000, %%eax \n"
3619 "or %%eax, %%ecx \n"
3621 "or %%eax, %%ecx \n"
3623 "shl $24, %%edx \n" // 0x0000000F -> 0x0F000000
3624 "and $0x0F000000, %%edx \n"
3625 "or %%edx, %%ecx \n"
3627 "or %%edx, %%ecx \n"
3629 "mov %%ecx, (%[dst]) \n"
3634 "mov (%[src]), %%eax \n" // read all 8 pixels
3637 "mov %%eax, %%edx \n"
3640 "xor %%ecx, %%ecx \n"
3641 "shr $28, %%eax \n" // 0xF0000000 -> 0x0000000F
3642 "or %%eax, %%ecx \n"
3644 "or %%eax, %%ecx \n"
3646 "mov %%edx, %%eax \n" // 0x0F000000 -> 0x00000F00
3648 "and $0x00000F00, %%eax \n"
3649 "or %%eax, %%ecx \n"
3651 "or %%eax, %%ecx \n"
3653 "mov %%edx, %%eax \n"
3654 "shr $4, %%eax \n" // 0x00F00000 -> 0x000F0000
3655 "and $0x000F0000, %%eax \n"
3656 "or %%eax, %%ecx \n"
3658 "or %%eax, %%ecx \n"
3660 "mov %%edx, %%eax \n"
3661 "shl $8, %%eax \n" // 0x000F0000 -> 0x0F000000
3662 "and $0x0F000000, %%eax \n"
3663 "or %%eax, %%ecx \n"
3665 "or %%eax, %%ecx \n"
3667 "mov %%ecx, (%[dst]) \n"
3672 "xor %%ecx, %%ecx \n"
3673 "mov %%edx, %%eax \n"
3674 "shr $12, %%eax \n" // 0x0000F000 -> 0x0000000F
3675 "and $0x0000000F, %%eax \n"
3676 "or %%eax, %%ecx \n"
3678 "or %%eax, %%ecx \n"
3680 "mov %%edx, %%eax \n" // 0x00000F00 -> 0x00000F00
3681 "and $0x00000F00, %%eax \n"
3682 "or %%eax, %%ecx \n"
3684 "or %%eax, %%ecx \n"
3686 "mov %%edx, %%eax \n"
3687 "shl $12, %%eax \n" // 0x000000F0 -> 0x000F0000
3688 "and $0x000F0000, %%eax \n"
3689 "or %%eax, %%ecx \n"
3691 "or %%eax, %%ecx \n"
3693 "shl $24, %%edx \n" // 0x0000000F -> 0x0F000000
3694 "and $0x0F000000, %%edx \n"
3695 "or %%edx, %%ecx \n"
3697 "or %%edx, %%ecx \n"
3699 "mov %%ecx, (%[dst]) \n"
3708 "add %[line], %[src] \n"
3709 "add %[ext], %[dst] \n"
3716 : [c
] "=&c" (fake_ecx
)
3717 : [src
] "S"(src
), [dst
] "D"(dst
), "[c]"(height
),
3718 [wid_64
] "g" (wid_64
), [line
] "g" ((uintptr_t)line
), [ext
] "g" ((uintptr_t)ext
)
3719 : "memory", "cc", "eax", "edx", "ebx"
3723 return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44
;
3726 //****************************************************************
3727 // Size: 0, Format: 0
3729 DWORD
Load4bSelect (unsigned char * dst
, unsigned char * src
, int wid_64
, int height
, int line
, int real_width
, int tile
)
3731 if (rdp
.tlut_mode
== 0)
3732 return Load4bI (dst
, src
, wid_64
, height
, line
, real_width
, tile
);
3734 return Load4bCI (dst
, src
, wid_64
, height
, line
, real_width
, tile
);