/* * 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