diff options
Diffstat (limited to 'src/mesa/drivers/dos/blit.S')
-rw-r--r-- | src/mesa/drivers/dos/blit.S | 845 |
1 files changed, 843 insertions, 2 deletions
diff --git a/src/mesa/drivers/dos/blit.S b/src/mesa/drivers/dos/blit.S index f5888c7e395..02dc8400d8d 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 : [email protected] * 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 |