1bits 32
2
3section .text
4
5%define which	[ebp+36]	; int which
6%define line	[ebp+40]	; int line
7%define where	[ebp+44]	; unsigned char *where
8
9%define vram	[ebp+24]	; unsigned char *vram
10%define reg	[ebp+28]	; unsigned char reg[0x20]
11%define highpal [ebp+32]	; unsigned int *highpal
12
13;%define cache_align times ($$-$) & 3 nop	; Align to 4-byte boundary
14;%define cache_align times ($$-$) & 7 nop	; Align to 8-byte boundary
15%define cache_align times ($$-$) & 31 nop	; Align to 32-byte boundary
16
17global asm_tiles_init
18global drawtile1_solid
19global drawtile1
20global drawtile2_solid
21global drawtile2
22global drawtile3_solid
23global drawtile3
24global drawtile4_solid
25global drawtile4
26
27; Neat utility macro
28%macro triple_xor 2
29	xor %1, %2	; Triple XOR for a neat register exchange  ;)
30	xor %2, %1
31	xor %1, %2
32%endmacro
33
34%macro blit_pixel1 1-*		; 8bpp blitting, solid
35	mov eax, ebx
36	and eax, %1
37    %if %0 > 1
38        shr eax, byte %2
39    %endif
40	or eax, [esi]
41	mov byte [edi], al
42	inc edi
43%endmacro
44
45%macro blit_pixel1_trans 1-*	; 8bpp blitting, transparent
46	mov eax, ebx
47	and eax, %1
48	jz %%trans
49    %if %0 > 1
50        shr eax, byte %2
51    %endif
52	or eax, [esi]
53	mov byte [edi], al
54    %%trans:
55	inc edi
56%endmacro
57
58%macro blit_pixel2 1-*		; 16bpp blitting, solid
59	mov eax, ebx
60	and eax, %1
61    %if %0 > 1
62        shr eax, byte %2
63    %endif
64	lea edx, [esi+eax*4]
65	mov eax, [edx]
66	mov word [edi], ax
67	add edi, byte 2
68%endmacro
69
70%macro blit_pixel2_trans 1-*	; 16bpp blitting, transparent
71	mov eax, ebx
72	and eax, %1
73	jz %%trans
74    %if %0 > 1
75        shr eax, byte %2
76    %endif
77	lea edx, [esi+eax*4]
78	mov eax, [edx]
79	mov word [edi], ax
80    %%trans:
81	add edi, byte 2
82%endmacro
83
84%macro blit_pixel3 1-*		; 24bpp blitting, solid
85	mov eax, ebx
86	and eax, %1
87    %if %0 > 1
88        shr eax, byte %2
89    %endif
90	lea edx, [esi+eax*4+1]
91	mov ax, word [edx]
92	mov word [edi], ax
93	add edi, 2
94	dec edx
95	mov al, byte [edx]
96	mov byte [edi], al
97	inc edi
98%endmacro
99
100%macro blit_pixel3_trans 1-*	; 24bpp blitting, transparent
101	mov eax, ebx
102	and eax, %1
103	jz %%trans
104    %if %0 > 1
105        shr eax, byte %2
106    %endif
107	lea edx, [esi+eax*4+1]
108	mov ax, word [edx]
109	mov word [edi], ax
110	add edi, 2
111	dec edx
112	mov al, byte [edx]
113	mov byte [edi], al
114	inc edi
115	jmp %%next
116    %%trans:
117	add edi, byte 3
118    %%next:
119%endmacro
120
121%macro blit_pixel4 1-*		; 32bpp blitting, solid
122	mov eax, ebx
123	and eax, %1
124    %if %0 > 1
125        shr eax, byte %2
126    %endif
127	lea edx, [esi+eax*4]
128	mov eax, [edx]
129	mov [edi], eax
130	add edi, byte 4
131%endmacro
132
133%macro blit_pixel4_trans 1-*	; 32bpp blitting, transparent
134	mov eax, ebx
135	and eax, %1
136	jz %%trans
137    %if %0 > 1
138        shr eax, byte %2
139    %endif
140	lea edx, [esi+eax*4]
141	mov eax, [edx]
142	mov [edi], eax
143    %%trans:
144	add edi, byte 4
145%endmacro
146
147; ----------------------------------------
148; int _asm_tiles_init
149;   (unsigned char *vram, unsigned char *reg, unsigned char *highpal)
150; ----------------------------------------
151
152	cache_align
153
154asm_tiles_init:
155
156	push eax
157	push ebx
158	push edx
159	push esp
160	push ebp
161	mov ebp, esp
162
163	mov eax, vram
164	mov ebx, reg
165	mov edx, highpal
166	mov [__vram], eax
167	mov [__reg], ebx
168	mov [__highpal], edx
169
170	pop ebp
171	pop esp
172	pop edx
173	pop ebx
174	pop eax
175
176	ret
177
178	cache_align
179
180; ----------------------------------------
181; int _drawtile1_solid
182;   (int which, int line, unsigned char *where)
183; ----------------------------------------
184
185	cache_align
186
187drawtile1_solid:
188
189	pushad
190	mov ebp, esp
191
192.setup:
193
194.get_pal:
195
196	mov ebx, which
197	mov esi, [__highpal]
198	mov eax, ebx
199	shr eax, byte 7
200	and eax, 0xc0
201	add esi, eax
202	mov edi, [__reg]
203	push esi
204
205.check_y_flip:
206
207	mov eax, ebx
208	xor ecx, ecx
209	mov edx, line
210	test eax, 0x1000
211
212	jz .check_interlace
213
214.y_flipped:
215
216	xor edx, byte 7
217
218	cache_align
219
220.check_interlace:
221
222	mov esi, [__reg]
223	mov cl, [esi+12]
224	mov esi, [__vram]
225	and eax, 0x7ff
226	test cl, byte 0x2
227
228	jz .no_interlace
229
230.interlace:
231
232	lea edx, [edx*8]
233	shl eax, 6
234	jmp .check_x_flip
235
236	cache_align
237
238.no_interlace:
239
240	lea edx, [edx*4]
241	shl eax, 5
242
243	cache_align
244
245.check_x_flip:
246
247	add eax, edx
248	mov edi, where
249	lea esi, [esi+eax]
250	mov ebx, [esi]
251	pop esi
252	mov eax, which
253	test eax, 0x800
254
255	jz near .x_not_flipped
256
257.x_flipped:
258
259	blit_pixel1 0x0f000000, 24	; pixel 8
260	blit_pixel1 0xf0000000, 28	; ..... 7
261	blit_pixel1 0x000f0000, 16	; ..... 6
262	blit_pixel1 0x00f00000, 20	; ..... 5
263	blit_pixel1 0x00000f00, 8	; ..... 4
264	blit_pixel1 0x0000f000, 12	; ..... 3
265	blit_pixel1 0x0000000f		; ..... 2
266	blit_pixel1 0x000000f0, 4	; ..... 1
267
268	jmp .cleanup
269
270	cache_align
271
272.x_not_flipped:
273
274	blit_pixel1 0x000000f0, 4	; pixel 1
275	blit_pixel1 0x0000000f		; ..... 2
276	blit_pixel1 0x0000f000, 12	; ..... 3
277	blit_pixel1 0x00000f00, 8	; ..... 4
278	blit_pixel1 0x00f00000, 20	; ..... 5
279	blit_pixel1 0x000f0000, 16	; ..... 6
280	blit_pixel1 0xf0000000, 28	; ..... 7
281	blit_pixel1 0x0f000000, 24	; ..... 8
282
283	cache_align
284
285.cleanup:
286
287	popad
288
289	ret
290
291	cache_align
292
293; ----------------------------------------
294
295drawtile1:
296
297	pushad
298	mov ebp, esp
299
300.setup:
301
302.get_pal:
303
304	mov ebx, which
305	mov esi, [__highpal]
306	mov eax, ebx
307	shr eax, byte 7
308	and eax, 0xc0
309	add esi, eax
310	push esi
311
312.check_y_flip:
313
314	mov eax, ebx
315	xor ecx, ecx
316	mov edx, line
317	test eax, 0x1000
318
319	jz .check_interlace
320
321.y_flipped:
322
323	xor edx, byte 7
324
325	cache_align
326
327.check_interlace:
328
329	mov esi, [__reg]
330	mov cl, [esi+12]
331	mov esi, [__vram]
332	and eax, 0x7ff
333	test cl, byte 0x2
334
335	jz .no_interlace
336
337.interlace:
338
339	lea edx, [edx*8]
340	shl eax, 6
341	jmp .check_x_flip
342
343	cache_align
344
345.no_interlace:
346
347	lea edx, [edx*4]
348	shl eax, 5
349
350	cache_align
351
352.check_x_flip:
353
354	add eax, edx
355	mov edi, where
356	lea esi, [esi+eax]
357	mov ebx, [esi]
358	pop esi
359	test ebx, ebx
360
361	jz near .cleanup		; Don't waste time if the tile is blank!
362
363	mov eax, which
364	test eax, 0x800
365
366	jz near .x_not_flipped
367
368.x_flipped:
369
370	blit_pixel1_trans 0x0f000000, 24	; pixel 8
371	blit_pixel1_trans 0xf0000000, 28	; ..... 7
372	blit_pixel1_trans 0x000f0000, 16	; ..... 6
373	blit_pixel1_trans 0x00f00000, 20	; ..... 5
374	blit_pixel1_trans 0x00000f00, 8		; ..... 4
375	blit_pixel1_trans 0x0000f000, 12	; ..... 3
376	blit_pixel1_trans 0x0000000f		; ..... 2
377	blit_pixel1_trans 0x000000f0, 4		; ..... 1
378
379	jmp .cleanup
380
381	cache_align
382
383.x_not_flipped:
384
385	blit_pixel1_trans 0x000000f0, 4		; pixel 1
386	blit_pixel1_trans 0x0000000f		; ..... 2
387	blit_pixel1_trans 0x0000f000, 12	; ..... 3
388	blit_pixel1_trans 0x00000f00, 8		; ..... 4
389	blit_pixel1_trans 0x00f00000, 20	; ..... 5
390	blit_pixel1_trans 0x000f0000, 16	; ..... 6
391	blit_pixel1_trans 0xf0000000, 28	; ..... 7
392	blit_pixel1_trans 0x0f000000, 24	; ..... 8
393
394	cache_align
395
396.cleanup:
397
398	popad
399
400	ret
401
402	cache_align
403
404; ----------------------------------------
405
406	cache_align
407
408drawtile2_solid:
409
410	pushad
411	mov ebp, esp
412
413.setup:
414
415.get_pal:
416
417	mov ebx, which
418	mov esi, [__highpal]
419	mov ecx, esi
420	mov eax, ebx
421	shr eax, byte 7
422	and eax, 0xc0
423	add esi, eax
424; -
425	mov edi, [__reg]
426	mov edx, [edi + 7]
427	push dword [esi]
428	and edx, 0x3f
429	mov eax, [ecx + edx*4]
430	mov [esi], eax
431; -
432	push esi
433
434.check_y_flip:
435
436	mov eax, ebx
437	xor ecx, ecx
438	mov edx, line
439	test eax, 0x1000
440
441	jz .check_interlace
442
443.y_flipped:
444
445	xor edx, byte 7
446
447	cache_align
448
449.check_interlace:
450
451	mov esi, [__reg]
452	mov cl, [esi+12]
453	mov esi, [__vram]
454	and eax, 0x7ff
455	test cl, byte 0x2
456
457	jz .no_interlace
458
459.interlace:
460
461	lea edx, [edx*8]
462	shl eax, 6
463	jmp .check_x_flip
464
465	cache_align
466
467.no_interlace:
468
469	lea edx, [edx*4]
470	shl eax, 5
471
472	cache_align
473
474.check_x_flip:
475
476	add eax, edx
477	mov edi, where
478	lea esi, [esi+eax]
479	mov ebx, [esi]
480	pop esi
481	mov eax, which
482	test eax, 0x800
483
484	jz near .x_not_flipped
485
486.x_flipped:
487
488	blit_pixel2 0x0f000000, 24	; pixel 8
489	blit_pixel2 0xf0000000, 28	; ..... 7
490	blit_pixel2 0x000f0000, 16	; ..... 6
491	blit_pixel2 0x00f00000, 20	; ..... 5
492	blit_pixel2 0x00000f00, 8	; ..... 4
493	blit_pixel2 0x0000f000, 12	; ..... 3
494	blit_pixel2 0x0000000f		; ..... 2
495	blit_pixel2 0x000000f0, 4	; ..... 1
496
497	jmp .cleanup
498
499	cache_align
500
501.x_not_flipped:
502
503	blit_pixel2 0x000000f0, 4	; pixel 1
504	blit_pixel2 0x0000000f		; ..... 2
505	blit_pixel2 0x0000f000, 12	; ..... 3
506	blit_pixel2 0x00000f00, 8	; ..... 4
507	blit_pixel2 0x00f00000, 20	; ..... 5
508	blit_pixel2 0x000f0000, 16	; ..... 6
509	blit_pixel2 0xf0000000, 28	; ..... 7
510	blit_pixel2 0x0f000000, 24	; ..... 8
511
512	cache_align
513
514.cleanup:
515	pop dword [esi]
516	popad
517	ret
518
519	cache_align
520
521; ----------------------------------------
522
523	cache_align
524
525drawtile2:
526
527	pushad
528	mov ebp, esp
529
530.get_pal:
531
532	mov ebx, which
533	mov esi, [__highpal]
534	mov eax, ebx
535	shr eax, 7
536	and eax, 0xc0
537	add esi, eax
538	push esi
539
540.check_y_flip:
541
542	mov eax, ebx
543	xor ecx, ecx
544	mov edx, line
545	test eax, 0x1000
546
547	jz .check_interlace
548
549.y_flipped:
550
551	xor edx, byte 7
552
553	cache_align
554
555.check_interlace:
556
557	mov esi, [__reg]
558	mov cl, [esi+12]
559	mov esi, [__vram]
560	and eax, 0x7ff
561	test cl, byte 0x2
562
563	jz .no_interlace
564
565.interlace:
566
567	lea edx, [edx*8]
568	shl eax, 6
569
570	jmp .check_x_flip
571
572	cache_align
573
574.no_interlace:
575	lea edx, [edx*4]
576	shl eax, 5
577
578	cache_align
579
580.check_x_flip:
581
582	add eax, edx
583	mov edi, where
584	lea esi, [esi+eax]
585	mov ebx, [esi]
586	pop esi
587	test ebx, ebx
588
589	jz near .cleanup		; Don't waste time if the tile is blank!
590
591	mov eax, which
592	test eax, 0x800
593
594	jz near .x_not_flipped
595
596.x_flipped:
597
598	blit_pixel2_trans 0x0f000000, 24	; pixel 8
599	blit_pixel2_trans 0xf0000000, 28	; ..... 7
600	blit_pixel2_trans 0x000f0000, 16	; ..... 6
601	blit_pixel2_trans 0x00f00000, 20	; ..... 5
602	blit_pixel2_trans 0x00000f00, 8		; ..... 4
603	blit_pixel2_trans 0x0000f000, 12	; ..... 3
604	blit_pixel2_trans 0x0000000f		; ..... 2
605	blit_pixel2_trans 0x000000f0, 4		; ..... 1
606
607	jmp .cleanup
608
609	cache_align
610
611.x_not_flipped:
612
613	blit_pixel2_trans 0x000000f0, 4		; pixel 1
614	blit_pixel2_trans 0x0000000f		; ..... 2
615	blit_pixel2_trans 0x0000f000, 12	; ..... 3
616	blit_pixel2_trans 0x00000f00, 8		; ..... 4
617	blit_pixel2_trans 0x00f00000, 20	; ..... 5
618	blit_pixel2_trans 0x000f0000, 16	; ..... 6
619	blit_pixel2_trans 0xf0000000, 28	; ..... 7
620	blit_pixel2_trans 0x0f000000, 24	; ..... 8
621
622	cache_align
623
624.cleanup:
625	popad
626	ret
627
628	cache_align
629
630; ----------------------------------------
631
632drawtile3_solid:
633
634	pushad
635	mov ebp, esp
636
637.setup:
638
639.get_pal:
640
641	mov ebx, which
642	mov esi, [__highpal]
643	mov ecx, esi
644	mov eax, ebx
645	shr eax, byte 7
646	and eax, 0xc0
647	add esi, eax
648; -
649	mov edi, [__reg]
650	mov edx, [edi + 7]
651	push dword [esi]
652	and edx, 0x3f
653	mov eax, [ecx + edx*4]
654	mov [esi], eax
655; -
656	push esi
657
658.check_y_flip:
659
660	mov eax, ebx
661	xor ecx, ecx
662	mov edx, line
663	test eax, 0x1000
664
665	jz .check_interlace
666
667.y_flipped:
668
669	xor edx, byte 7
670
671	cache_align
672
673.check_interlace:
674
675	mov esi, [__reg]
676	mov cl, [esi+12]
677	mov esi, [__vram]
678	and eax, 0x7ff
679	test cl, byte 0x2
680
681	jz .no_interlace
682
683.interlace:
684
685	lea edx, [edx*8]
686	shl eax, 6
687	jmp .check_x_flip
688
689	cache_align
690
691.no_interlace:
692
693	lea edx, [edx*4]
694	shl eax, 5
695
696	cache_align
697
698.check_x_flip:
699
700	add eax, edx
701	mov edi, where
702	lea esi, [esi+eax]
703	mov ebx, [esi]
704	pop esi
705	mov eax, which
706	test eax, 0x800
707
708	jz near .x_not_flipped
709
710.x_flipped:
711
712	blit_pixel3 0x0f000000, 24	; pixel 8
713	blit_pixel3 0xf0000000, 28	; ..... 7
714	blit_pixel3 0x000f0000, 16	; ..... 6
715	blit_pixel3 0x00f00000, 20	; ..... 5
716	blit_pixel3 0x00000f00, 8	; ..... 4
717	blit_pixel3 0x0000f000, 12	; ..... 3
718	blit_pixel3 0x0000000f		; ..... 2
719	blit_pixel3 0x000000f0, 4	; ..... 1
720
721	jmp .cleanup
722
723	cache_align
724
725.x_not_flipped:
726
727	blit_pixel3 0x000000f0, 4	; pixel 1
728	blit_pixel3 0x0000000f		; ..... 2
729	blit_pixel3 0x0000f000, 12	; ..... 3
730	blit_pixel3 0x00000f00, 8	; ..... 4
731	blit_pixel3 0x00f00000, 20	; ..... 5
732	blit_pixel3 0x000f0000, 16	; ..... 6
733	blit_pixel3 0xf0000000, 28	; ..... 7
734	blit_pixel3 0x0f000000, 24	; ..... 8
735
736	cache_align
737
738.cleanup:
739
740	pop dword [esi]
741	popad
742	ret
743
744	cache_align
745
746; ----------------------------------------
747
748drawtile3:
749
750	pushad
751	mov ebp, esp
752
753.setup:
754
755.get_pal:
756
757	mov ebx, which
758	mov esi, [__highpal]
759	mov eax, ebx
760	shr eax, byte 7
761	and eax, 0xc0
762	add esi, eax
763	push esi
764
765.check_y_flip:
766
767	mov eax, ebx
768	xor ecx, ecx
769	mov edx, line
770	test eax, 0x1000
771
772	jz .check_interlace
773
774.y_flipped:
775
776	xor edx, byte 7
777
778	cache_align
779
780.check_interlace:
781
782	mov esi, [__reg]
783	mov cl, [esi+12]
784	mov esi, [__vram]
785	and eax, 0x7ff
786	test cl, byte 0x2
787
788	jz .no_interlace
789
790.interlace:
791
792	lea edx, [edx*8]
793	shl eax, 6
794	jmp .check_x_flip
795
796	cache_align
797
798.no_interlace:
799
800	lea edx, [edx*4]
801	shl eax, 5
802
803	cache_align
804
805.check_x_flip:
806
807	add eax, edx
808	mov edi, where
809	lea esi, [esi+eax]
810	mov ebx, [esi]
811	pop esi
812	test ebx, ebx
813
814	jz near .cleanup		; Don't waste time if the tile is blank!
815
816	mov eax, which
817	test eax, 0x800
818
819	jz near .x_not_flipped
820
821.x_flipped:
822
823	blit_pixel3_trans 0x0f000000, 24	; pixel 8
824	blit_pixel3_trans 0xf0000000, 28	; ..... 7
825	blit_pixel3_trans 0x000f0000, 16	; ..... 6
826	blit_pixel3_trans 0x00f00000, 20	; ..... 5
827	blit_pixel3_trans 0x00000f00, 8		; ..... 4
828	blit_pixel3_trans 0x0000f000, 12	; ..... 3
829	blit_pixel3_trans 0x0000000f		; ..... 2
830	blit_pixel3_trans 0x000000f0, 4		; ..... 1
831
832	jmp .cleanup
833
834	cache_align
835
836.x_not_flipped:
837
838	blit_pixel3_trans 0x000000f0, 4		; pixel 1
839	blit_pixel3_trans 0x0000000f		; ..... 2
840	blit_pixel3_trans 0x0000f000, 12	; ..... 3
841	blit_pixel3_trans 0x00000f00, 8		; ..... 4
842	blit_pixel3_trans 0x00f00000, 20	; ..... 5
843	blit_pixel3_trans 0x000f0000, 16	; ..... 6
844	blit_pixel3_trans 0xf0000000, 28	; ..... 7
845	blit_pixel3_trans 0x0f000000, 24	; ..... 8
846
847	cache_align
848
849.cleanup:
850
851	popad
852
853	ret
854
855	cache_align
856
857; ----------------------------------------
858
859drawtile4_solid:
860
861	pushad
862	mov ebp, esp
863
864.setup:
865
866.get_pal:
867
868	mov ebx, which
869	mov esi, [__highpal]
870	mov ecx, esi
871	mov eax, ebx
872	shr eax, byte 7
873	and eax, 0xc0
874	add esi, eax
875; -
876	mov edi, [__reg]
877	mov edx, [edi + 7]
878	push dword [esi]
879	and edx, 0x3f
880	mov eax, [ecx + edx*4]
881	mov [esi], eax
882; -
883	push esi
884
885.check_y_flip:
886
887	mov eax, ebx
888	xor ecx, ecx
889	mov edx, line
890	test eax, 0x1000
891
892	jz .check_interlace
893
894.y_flipped:
895
896	xor edx, byte 7
897
898	cache_align
899
900.check_interlace:
901
902	mov esi, [__reg]
903	mov cl, [esi+12]
904	mov esi, [__vram]
905	and eax, 0x7ff
906	test cl, byte 0x2
907
908	jz .no_interlace
909
910.interlace:
911
912	lea edx, [edx*8]
913	shl eax, 6
914	jmp .check_x_flip
915
916	cache_align
917
918.no_interlace:
919
920	lea edx, [edx*4]
921	shl eax, 5
922
923	cache_align
924
925.check_x_flip:
926
927	add eax, edx
928	mov edi, where
929	lea esi, [esi+eax]
930	mov ebx, [esi]
931	pop esi
932	mov eax, which
933	test eax, 0x800
934
935	jz near .x_not_flipped
936
937.x_flipped:
938
939	blit_pixel4 0x0f000000, 24	; pixel 8
940	blit_pixel4 0xf0000000, 28	; ..... 7
941	blit_pixel4 0x000f0000, 16	; ..... 6
942	blit_pixel4 0x00f00000, 20	; ..... 5
943	blit_pixel4 0x00000f00, 8	; ..... 4
944	blit_pixel4 0x0000f000, 12	; ..... 3
945	blit_pixel4 0x0000000f		; ..... 2
946	blit_pixel4 0x000000f0, 4	; ..... 1
947
948	jmp .cleanup
949
950	cache_align
951
952.x_not_flipped:
953
954	blit_pixel4 0x000000f0, 4	; pixel 1
955	blit_pixel4 0x0000000f		; ..... 2
956	blit_pixel4 0x0000f000, 12	; ..... 3
957	blit_pixel4 0x00000f00, 8	; ..... 4
958	blit_pixel4 0x00f00000, 20	; ..... 5
959	blit_pixel4 0x000f0000, 16	; ..... 6
960	blit_pixel4 0xf0000000, 28	; ..... 7
961	blit_pixel4 0x0f000000, 24	; ..... 8
962
963	cache_align
964
965.cleanup:
966
967	pop dword [esi]
968	popad
969	ret
970
971	cache_align
972
973; ----------------------------------------
974
975drawtile4:
976
977	pushad
978	mov ebp, esp
979
980.setup:
981
982.get_pal:
983
984	mov ebx, which
985	mov esi, [__highpal]
986	mov eax, ebx
987	shr eax, byte 7
988	and eax, 0xc0
989	add esi, eax
990	push esi
991
992.check_y_flip:
993
994	mov eax, ebx
995	xor ecx, ecx
996	mov edx, line
997	test eax, 0x1000
998
999	jz .check_interlace
1000
1001.y_flipped:
1002
1003	xor edx, byte 7
1004
1005	cache_align
1006
1007.check_interlace:
1008
1009	mov esi, [__reg]
1010	mov cl, [esi+12]
1011	mov esi, [__vram]
1012	and eax, 0x7ff
1013	test cl, byte 0x2
1014
1015	jz .no_interlace
1016
1017.interlace:
1018
1019	lea edx, [edx*8]
1020	shl eax, 6
1021	jmp .check_x_flip
1022
1023	cache_align
1024
1025.no_interlace:
1026
1027	lea edx, [edx*4]
1028	shl eax, 5
1029
1030	cache_align
1031
1032.check_x_flip:
1033
1034	add eax, edx
1035	mov edi, where
1036	lea esi, [esi+eax]
1037	mov ebx, [esi]
1038	pop esi
1039	test ebx, ebx
1040
1041	jz near .cleanup		; Don't waste time if the tile is blank!
1042
1043	mov eax, which
1044	test eax, 0x800
1045
1046	jz near .x_not_flipped
1047
1048.x_flipped:
1049
1050	blit_pixel4_trans 0x0f000000, 24	; pixel 8
1051	blit_pixel4_trans 0xf0000000, 28	; ..... 7
1052	blit_pixel4_trans 0x000f0000, 16	; ..... 6
1053	blit_pixel4_trans 0x00f00000, 20	; ..... 5
1054	blit_pixel4_trans 0x00000f00, 8		; ..... 4
1055	blit_pixel4_trans 0x0000f000, 12	; ..... 3
1056	blit_pixel4_trans 0x0000000f		; ..... 2
1057	blit_pixel4_trans 0x000000f0, 4		; ..... 1
1058
1059	jmp .cleanup
1060
1061	cache_align
1062
1063.x_not_flipped:
1064
1065	blit_pixel4_trans 0x000000f0, 4		; pixel 1
1066	blit_pixel4_trans 0x0000000f		; ..... 2
1067	blit_pixel4_trans 0x0000f000, 12	; ..... 3
1068	blit_pixel4_trans 0x00000f00, 8		; ..... 4
1069	blit_pixel4_trans 0x00f00000, 20	; ..... 5
1070	blit_pixel4_trans 0x000f0000, 16	; ..... 6
1071	blit_pixel4_trans 0xf0000000, 28	; ..... 7
1072	blit_pixel4_trans 0x0f000000, 24	; ..... 8
1073
1074	cache_align
1075
1076.cleanup:
1077
1078	popad
1079
1080	ret
1081
1082	cache_align
1083
1084section .data
1085
1086	__vram		dd 0
1087	__reg		dd 0
1088	__highpal	dd 0
1089
1090; ----------------------------------------
1091
1092%ifdef NASM_STACK_NOEXEC
1093section .note.GNU-stack noalloc noexec nowrite progbits
1094%endif
1095