summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dos/blit.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dos/blit.S')
-rw-r--r--src/mesa/drivers/dos/blit.S845
1 files changed, 843 insertions, 2 deletions
diff --git a/src/mesa/drivers/dos/blit.S b/src/mesa/drivers/dos/blit.S
index f5888c7e39..02dc8400d8 100644
--- a/src/mesa/drivers/dos/blit.S
+++ b/src/mesa/drivers/dos/blit.S
@@ -23,9 +23,9 @@
*/
/*
- * DOS/DJGPP device driver v1.3 for Mesa
+ * DOS/DJGPP device driver for Mesa
*
- * Copyright (C) 2002 - Borca Daniel
+ * Author: Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@@ -197,3 +197,844 @@ _vesa_l_dump_virtual_mmx:
emms
#endif
ret
+
+
+
+#define CVT_32_TO_16(s, tmp) \
+ /* SRC = bbbbbbbbggggggggrrrrrrrr******** */\
+ movl %e##s##x, %tmp ;\
+ /* TMP = bbbbbbbbggggggggrrrrrrrr******** */\
+ shrb $2, %s##h ;\
+ /* SRC = bbbbbbbbgggggg00rrrrrrrr******** */\
+ andl $0xF80000, %tmp ;\
+ /* TMP = 0000000000000000000rrrrr00000000 */\
+ shrw $3, %s##x ;\
+ /* SRC = bbbbbgggggg00000rrrrrrrr******** */\
+ shrl $8, %tmp ;\
+ /* TMP = 00000000000rrrrr0000000000000000 */\
+ orl %tmp, %e##s##x ;\
+ /* SRC = bbbbbggggggrrrrrrrrrrrrr******** */
+
+#define CVT_32_TO_15(s, tmp) \
+ /* SRC = bbbbbbbbggggggggrrrrrrrr******** */\
+ movl %e##s##x, %tmp ;\
+ /* TMP = bbbbbbbbggggggggrrrrrrrr******** */\
+ shrb $3, %s##h ;\
+ /* SRC = bbbbbbbbgggggg00rrrrrrrr******** */\
+ andl $0xF80000, %tmp ;\
+ /* TMP = 0000000000000000000rrrrr00000000 */\
+ shrw $3, %s##x ;\
+ /* SRC = bbbbbgggggg00000rrrrrrrr******** */\
+ shrl $9, %tmp ;\
+ /* TMP = 00000000000rrrrr0000000000000000 */\
+ orl %tmp, %e##s##x ;\
+ /* SRC = bbbbbggggggrrrrrrrrrrrrr******** */
+
+#define CVT_16_TO_15(src, tmp) \
+ /* SRC = bbbbbggggggrrrrrBBBBBGGGGGGRRRRR */\
+ movl %src, %tmp ;\
+ /* TMP = bbbbbggggggrrrrrBBBBBGGGGGGRRRRR */\
+ andl $0x1F001F, %src ;\
+ /* SRC = bbbbb00000000000BBBBB00000000000 */\
+ andl $0xFFC0FFC0, %tmp ;\
+ /* TMP = 000000gggggrrrrr000000GGGGGRRRRR */\
+ shrl %tmp ;\
+ /* TMP = 00000gggggrrrrr000000GGGGGRRRRR0 */\
+ orl %tmp, %src ;\
+ /* SRC = bbbbbgggggrrrrr0BBBBBGGGGGRRRRR0 */\
+
+
+
+/* transform BGRA to BGR */
+ .p2align 5,,31
+ .global _vesa_l_dump_32_to_24
+_vesa_l_dump_32_to_24:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %ecx
+ 1:
+ movl (%esi), %eax
+ addl $4, %esi
+ movw %ax, %fs:(%edi)
+ shrl $16, %eax
+ movb %al, %fs:2(%edi)
+ addl $3, %edi
+ subl $3, %ecx
+ jnz 1b
+ popl %ecx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+/* transform BGRA to B5G6R5 */
+ .p2align 5,,31
+ .global _vesa_l_dump_32_to_16
+_vesa_l_dump_32_to_16:
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %ecx
+ 1:
+ movl (%esi), %eax
+ addl $4, %esi
+ CVT_32_TO_16(a, ebp)
+ movw %ax, %fs:(%edi)
+ addl $2, %edi
+ subl $2, %ecx
+ jnz 1b
+ popl %ecx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret
+
+/* transform BGRA to B5G5R5 */
+ .p2align 5,,31
+ .global _vesa_l_dump_32_to_15
+_vesa_l_dump_32_to_15:
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %ecx
+ 1:
+ movl (%esi), %eax
+ addl $4, %esi
+ CVT_32_TO_15(a, ebp)
+ movw %ax, %fs:(%edi)
+ addl $2, %edi
+ subl $2, %ecx
+ jnz 1b
+ popl %ecx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret
+
+/* transform BGRA to fake8 */
+ .p2align 5,,31
+ .global _vesa_l_dump_32_to_8
+_vesa_l_dump_32_to_8:
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %edx
+ pushl %ecx
+ pushl %ebx
+ 1:
+ movl (%esi), %eax
+ addl $4, %esi
+#if 1
+ xorl %ebx, %ebx
+ movl %eax, %edx
+ movb %ah, %bl
+ shrl $16, %edx
+ andl $0xFF, %edx
+ andl $0xFF, %eax
+
+ movb _array_b(%eax), %al
+ movb _array_r(%edx), %dl
+ movb _array_g(%ebx), %bl
+
+ imull $36, %eax
+ imull $6, %ebx
+ addl %edx, %eax
+ addl %ebx, %eax
+#endif
+ movb %al, %fs:(%edi)
+ incl %edi
+ decl %ecx
+ jnz 1b
+ popl %ebx
+ popl %ecx
+ popl %edx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret
+
+/* transform BGR to BGRx */
+ .p2align 5,,31
+ .global _vesa_l_dump_24_to_32
+_vesa_l_dump_24_to_32:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %ecx
+ 1:
+ movl (%esi), %eax
+ addl $3, %esi
+ movl %eax, %fs:(%edi)
+ addl $4, %edi
+ subl $4, %ecx
+ jnz 1b
+ popl %ecx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+/* transform BGR to fake8 */
+ .p2align 5,,31
+ .global _vesa_l_dump_24_to_8
+_vesa_l_dump_24_to_8:
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %edx
+ pushl %ecx
+ pushl %ebx
+ 1:
+ movl (%esi), %eax
+ addl $3, %esi
+#if 1
+ xorl %ebx, %ebx
+ movl %eax, %edx
+ movb %ah, %bl
+ shrl $16, %edx
+ andl $0xFF, %edx
+ andl $0xFF, %eax
+
+ movb _array_b(%eax), %al
+ movb _array_r(%edx), %dl
+ movb _array_g(%ebx), %bl
+
+ imull $36, %eax
+ imull $6, %ebx
+ addl %edx, %eax
+ addl %ebx, %eax
+#endif
+ movb %al, %fs:(%edi)
+ incl %edi
+ decl %ecx
+ jnz 1b
+ popl %ebx
+ popl %ecx
+ popl %edx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret
+
+/* transform B5G6R5 to B5G5R5 */
+ .p2align 5,,31
+ .global _vesa_l_dump_16_to_15
+_vesa_l_dump_16_to_15:
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %ecx
+ 1:
+ movl (%esi), %eax
+ addl $4, %esi
+ CVT_16_TO_15(eax, ebp)
+ movl %eax, %fs:(%edi)
+ addl $4, %edi
+ subl $4, %ecx
+ jnz 1b
+ popl %ecx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret
+
+/* transform B5G6R5 to fake8 */
+ .p2align 5,,31
+ .global _vesa_l_dump_16_to_8
+_vesa_l_dump_16_to_8:
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %edx
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %ecx
+ pushl %ebx
+ 1:
+ movl (%esi), %eax
+ addl $4, %esi
+#if 1
+ movl %eax, %ebx
+ andl $0xFFFF, %eax
+ shrl $16, %ebx
+ movb _tab_16_8(%eax), %al
+ movb _tab_16_8(%ebx), %ah
+#endif
+ movw %ax, %fs:(%edi)
+ addl $2, %edi
+ subl $2, %ecx
+ jnz 1b
+ popl %ebx
+ popl %ecx
+ addl %ebx, %edi
+ decl %edx
+ jnz 0b
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+ ret
+
+
+
+ .p2align 5,,31
+ .global _vesa_b_dump_32_to_24
+_vesa_b_dump_32_to_24:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ movl $0x00FFFFFF, %ebx
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ pushl %ebx
+ incl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ popl %ebx
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movb (%esi), %al /* XXX too many accesses */
+ incl %esi
+ rorl $8, %ebx
+ jnc 2b
+ movb %al, %fs:(%edi)
+ incl %edi
+ decl %ecx
+ jnz 1b
+ popl %ecx
+ popl %eax
+ addl _vl_current_delta, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_32_to_16
+_vesa_b_dump_32_to_16:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ incl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movl (%esi), %eax
+ addl $4, %esi
+ CVT_32_TO_16(a, ebx)
+ movw %ax, %fs:(%edi)
+ addl $2, %edi
+ subl $2, %ecx
+ jnz 1b
+ popl %ecx
+ popl %eax
+ addl _vl_current_delta, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_32_to_15
+_vesa_b_dump_32_to_15:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ incl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movl (%esi), %eax
+ addl $4, %esi
+ CVT_32_TO_15(a, ebx)
+ movw %ax, %fs:(%edi)
+ addl $2, %edi
+ subl $2, %ecx
+ jnz 1b
+ popl %ecx
+ popl %eax
+ addl _vl_current_delta, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_32_to_8
+_vesa_b_dump_32_to_8:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ pushl %edx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ popl %edx
+ incl %edx
+ pushl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movl (%esi), %eax
+ addl $4, %esi
+#if 1
+ xorl %ebx, %ebx
+ movl %eax, %edx
+ movb %ah, %bl
+ shrl $16, %edx
+ andl $0xFF, %edx
+ andl $0xFF, %eax
+
+ movb _array_b(%eax), %al
+ movb _array_r(%edx), %dl
+ movb _array_g(%ebx), %bl
+
+ imull $36, %eax
+ imull $6, %ebx
+ addl %edx, %eax
+ addl %ebx, %eax
+#endif
+ movb %al, %fs:(%edi)
+ incl %edi
+ decl %ecx
+ jnz 1b
+ popl %edx
+ popl %ecx
+ popl %eax
+ addl _vl_current_delta, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_24_to_32
+_vesa_b_dump_24_to_32:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ pushl %ebx
+ incl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ popl %ebx
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movl (%esi), %eax
+ addl $3, %esi
+ movl %eax, %fs:(%edi)
+ addl $4, %edi
+ subl $4, %ecx
+ jnz 1b
+ popl %ecx
+ popl %eax
+ addl %ebx, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_24_to_8
+_vesa_b_dump_24_to_8:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ pushl %edx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ popl %edx
+ incl %edx
+ pushl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movl (%esi), %eax
+ addl $3, %esi
+#if 1
+ xorl %ebx, %ebx
+ movl %eax, %edx
+ movb %ah, %bl
+ shrl $16, %edx
+ andl $0xFF, %edx
+ andl $0xFF, %eax
+
+ movb _array_b(%eax), %al
+ movb _array_r(%edx), %dl
+ movb _array_g(%ebx), %bl
+
+ imull $36, %eax
+ imull $6, %ebx
+ addl %edx, %eax
+ addl %ebx, %eax
+#endif
+ movb %al, %fs:(%edi)
+ incl %edi
+ decl %ecx
+ jnz 1b
+ popl %edx
+ popl %ecx
+ popl %eax
+ addl _vl_current_delta, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_16_to_15
+_vesa_b_dump_16_to_15:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ incl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movw (%esi), %ax
+ addl $2, %esi
+ CVT_16_TO_15(eax, ebx)
+ movw %ax, %fs:(%edi)
+ addl $2, %edi
+ subl $2, %ecx
+ jnz 1b
+ popl %ecx
+ popl %eax
+ addl _vl_current_delta, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .p2align 5,,31
+ .global _vesa_b_dump_16_to_8
+_vesa_b_dump_16_to_8:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl _vl_video_selector, %fs
+ movl _vl_current_draw_buffer, %esi
+ movl _vl_current_offset, %edi
+ movl _vesa_gran_shift, %ecx
+ movl _vesa_gran_mask, %ebp
+ movl %edi, %edx
+ xorl %ebx, %ebx
+ andl %ebp, %edi
+ shrl %cl, %edx
+ incl %ebp
+ call *_vesa_swbank
+ movl _vl_current_stride, %ecx
+ movl _vl_current_height, %eax
+ movl _vl_current_delta, %ebx
+ .balign 4
+ 0:
+ pushl %eax
+ pushl %ecx
+ .balign 4
+ 1:
+ cmpl %ebp, %edi
+ jb 2f
+ pushl %ebx
+ incl %edx
+ xorl %ebx, %ebx
+ call *_vesa_swbank
+ popl %ebx
+ subl %ebp, %edi
+ .balign 4
+ 2:
+ movw (%esi), %ax
+ addl $2, %esi
+#if 1
+ andl $0xFFFF, %eax
+ movb _tab_16_8(%eax), %al
+#endif
+ movb %al, %fs:(%edi)
+ addl $1, %edi
+ subl $1, %ecx
+ jnz 1b
+ popl %ecx
+ popl %eax
+ addl %ebx, %edi
+ decl %eax
+ jnz 0b
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret