blob: 02dc8400d8dcb0558865b772767d3ac3f8f5e9be [file] [log] [blame]
/*
* Mesa 3-D graphics library
* Version: 4.0
*
* Copyright (C) 1999 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* DOS/DJGPP device driver for Mesa
*
* Author: Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
.file "blit.S"
/*
* extern unsigned int vesa_gran_mask, vesa_gran_shift;
* extern int vl_video_selector;
* extern void *vl_current_draw_buffer;
* extern int vl_current_stride, vl_current_height;
* extern int vl_current_offset, vl_current_delta;
*/
.text
/* Desc: VESA bank switching routine (BIOS)
*
* In : EBX=0, EDX = bank number
* Out : -
*
* Note: thrashes EAX
*/
.p2align 5,,31
_vesa_swbankBIOS:
movw $0x4f05, %ax
int $0x10
ret
.p2align 2,,3
.global _vesa_swbank
_vesa_swbank: .long _vesa_swbankBIOS
/* Desc: void vesa_b_dump_virtual (void);
*
* In : -
* Out : -
*
* Note: uses current draw buffer
*/
.p2align 5,,31
.global _vesa_b_dump_virtual
_vesa_b_dump_virtual:
cld
pushl %es
pushl %ebx
pushl %esi
pushl %edi
pushl %ebp
movl _vl_video_selector, %es
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
shrl $2, %ecx
.balign 4
0:
pushl %ecx
.balign 4
1:
cmpl %ebp, %edi
jb 2f
pushl %eax
pushl %ebx
incl %edx
xorl %ebx, %ebx
call *_vesa_swbank
popl %ebx
popl %eax
subl %ebp, %edi
.balign 4
2:
movsl
decl %ecx
jnz 1b
popl %ecx
addl %ebx, %edi
decl %eax
jnz 0b
popl %ebp
popl %edi
popl %esi
popl %ebx
popl %es
ret
/* Desc: void vesa_l_dump_virtual (void);
*
* In : -
* Out : -
*
* Note: uses current draw buffer
*/
.p2align 5,,31
.global _vesa_l_dump_virtual
_vesa_l_dump_virtual:
cld
pushl %es
pushl %esi
pushl %edi
movl _vl_video_selector, %es
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, %eax
shrl $2, %ecx
.balign 4
0:
pushl %ecx
rep; movsl
popl %ecx
addl %eax, %edi
decl %edx
jnz 0b
popl %edi
popl %esi
popl %es
ret
/* Desc: void vesa_l_dump_virtual_mmx (void);
*
* In : -
* Out : -
*
* Note: uses current draw buffer
*/
.p2align 5,,31
.global _vesa_l_dump_virtual_mmx
_vesa_l_dump_virtual_mmx:
#ifdef USE_MMX_ASM
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, %eax
shrl $3, %ecx
.balign 4
0:
pushl %ecx
.balign 4
1:
movq (%esi), %mm0
addl $8, %esi
movq %mm0, %fs:(%edi)
addl $8, %edi
decl %ecx
jnz 1b
popl %ecx
addl %eax, %edi
decl %edx
jnz 0b
popl %edi
popl %esi
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