/* * 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 v1.3 for Mesa 5.0 * * Copyright (C) 2002 - Borca Daniel * Email : dborca@yahoo.com * Web : http://www.geocities.com/dborca */ .file "virtual.S" /* * extern void *vl_current_draw_buffer; * extern int vl_current_width, vl_current_bytes; */ .text /* Desc: void v_clear8 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear8 _v_clear8: movl 4(%esp), %eax movb %al, %ah pushw %ax pushw %ax popl %eax jmp _v_clear_common /* Desc: void v_clear16 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear16 _v_clear16: movl 4(%esp), %eax pushw %ax pushw %ax popl %eax jmp _v_clear_common /* Desc: void v_clear32 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear32 _v_clear32: movl 4(%esp), %eax .balign 4 _v_clear_common: movl _vl_current_bytes, %ecx movl _vl_current_draw_buffer, %edx shrl $2, %ecx .balign 4 0: movl %eax, (%edx) addl $4, %edx decl %ecx jnz 0b ret /* Desc: void v_clear8_mmx (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear8_mmx _v_clear8_mmx: movl 4(%esp), %eax movb %al, %ah pushw %ax pushw %ax pushw %ax pushw %ax jmp _v_clear_common_mmx /* Desc: void v_clear16_mmx (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear16_mmx _v_clear16_mmx: movl 4(%esp), %eax pushw %ax pushw %ax pushw %ax pushw %ax jmp _v_clear_common_mmx /* Desc: void v_clear32_mmx (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear32_mmx _v_clear32_mmx: movl 4(%esp), %eax pushl %eax pushl %eax .balign 4 _v_clear_common_mmx: #ifdef USE_MMX_ASM movl _vl_current_bytes, %ecx movl _vl_current_draw_buffer, %edx movq (%esp), %mm0 shrl $3, %ecx .balign 4 0: movq %mm0, (%edx) addl $8, %edx decl %ecx jnz 0b emms #endif addl $8, %esp ret /* Desc: void v_clear24 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear24 _v_clear24: movl $0xaaaaaaab, %eax mull _vl_current_bytes movl 4(%esp), %eax movl %edx, %ecx pushl %ebx movl _vl_current_draw_buffer, %edx shrl %ecx movb 10(%esp), %bl .balign 4 0: movw %ax, (%edx) movb %bl, 2(%edx) addl $3, %edx decl %ecx jnz 0b popl %ebx ret /* Desc: void v_clear24_mmx (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_clear24_mmx _v_clear24_mmx: #ifdef USE_MMX_ASM movl 4(%esp), %eax movl %eax, %edx movl %eax, %ecx shll $16, %edx rorl $8, %ecx movw %cx, %dx rorl $16, %ecx movb %dh, %cl shll $8, %eax movb %ch, %al rorl $8, %eax pushl %edx pushl %eax movq (%esp), %mm0 pushl %ecx movq (%esp), %mm1 pushl %edx movq (%esp), %mm2 movl $0xaaaaaaab, %eax mull _vl_current_bytes movl %edx, %ecx movl _vl_current_draw_buffer, %edx shrl $4, %ecx .balign 4 0: movq %mm0, (%edx) movq %mm1, 8(%edx) movq %mm2, 16(%edx) addl $24, %edx decl %ecx jnz 0b emms addl $16, %esp #endif ret /* Desc: void v_rect8 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_rect8 _v_rect8: cld pushl %esi pushl %edi movl 28(%esp), %eax movl _vl_current_width, %esi movl 16(%esp), %edi movb %al, %ah movl 20(%esp), %ecx imull %esi, %edi movl 24(%esp), %edx subl %ecx, %esi addl 12(%esp), %edi pushw %ax pushw %ax pushl %ds popl %es addl _vl_current_draw_buffer, %edi popl %eax pushl %ebx movl %ecx, %ebx andl $3, %ebx .balign 4 0: pushl %ecx .balign 4 1: shrl $2, %ecx rep; stosl testl %ebx, %ebx jz 2f movl %ebx, %ecx rep; stosb .balign 4 2: popl %ecx addl %esi, %edi decl %edx jnz 0b popl %ebx popl %edi popl %esi ret /* Desc: void v_rect16 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_rect16 _v_rect16: cld pushl %esi pushl %edi movl 28(%esp), %eax movl _vl_current_width, %esi movl 16(%esp), %edi movl 20(%esp), %ecx imull %esi, %edi movl 24(%esp), %edx subl %ecx, %esi addl 12(%esp), %edi pushw %ax shll %esi pushw %ax shll %edi pushl %ds popl %es addl _vl_current_draw_buffer, %edi popl %eax .balign 4 0: pushl %ecx .balign 4 1: shrl %ecx rep; stosl jnc 2f stosw .balign 4 2: popl %ecx addl %esi, %edi decl %edx jnz 0b popl %edi popl %esi ret /* Desc: void v_rect24 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_rect24 _v_rect24: pushl %esi pushl %edi movl 28(%esp), %eax movl _vl_current_width, %esi movl 16(%esp), %edi movl 20(%esp), %ecx imull %esi, %edi movl 24(%esp), %edx subl %ecx, %esi addl 12(%esp), %edi leal (%esi, %esi, 2), %esi pushl %ebx leal (%edi, %edi, 2), %edi movl %eax, %ebx addl _vl_current_draw_buffer, %edi shrl $16, %ebx .balign 4 0: pushl %ecx .balign 4 1: movw %ax, (%edi) movb %bl, 2(%edi) addl $3, %edi decl %ecx jnz 1b popl %ecx addl %esi, %edi decl %edx jnz 0b popl %ebx popl %edi popl %esi ret /* Desc: void v_rect32 (int color); * * In : color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_rect32 _v_rect32: pushl %esi pushl %edi movl _vl_current_width, %esi movl 16(%esp), %edi movl 20(%esp), %ecx imull %esi, %edi movl 24(%esp), %edx subl %ecx, %esi addl 12(%esp), %edi shll $2, %esi shll $2, %edi movl 28(%esp), %eax addl _vl_current_draw_buffer, %edi .balign 4 0: pushl %ecx .balign 4 1: movl %eax, (%edi) addl $4, %edi decl %ecx jnz 1b popl %ecx addl %esi, %edi decl %edx jnz 0b popl %edi popl %esi ret /* Desc: void v_putpixel8 (unsigned int offset, int color); * * In : offset within buffer, color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_putpixel8 _v_putpixel8: movl 8(%esp), %ecx movl 4(%esp), %edx movl _vl_current_draw_buffer, %eax movb %cl, (%eax,%edx) ret /* Desc: void v_putpixel16 (unsigned int offset, int color); * * In : offset within buffer, color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_putpixel16 _v_putpixel16: movl 8(%esp), %ecx movl 4(%esp), %edx movl _vl_current_draw_buffer, %eax movw %cx, (%eax,%edx,2) ret /* Desc: void v_putpixel24 (unsigned int offset, int color); * * In : offset within buffer, color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_putpixel24 _v_putpixel24: movl 4(%esp), %eax movl 8(%esp), %edx movl _vl_current_draw_buffer, %ecx leal (%eax,%eax,2), %eax movw %dx, (%ecx,%eax) shrl $16, %edx movb %dl, 2(%ecx,%eax) ret /* Desc: void v_putpixel32 (unsigned int offset, int color); * * In : offset within buffer, color * Out : - * * Note: uses current draw buffer */ .p2align 5,,31 .global _v_putpixel32 _v_putpixel32: movl 8(%esp), %ecx movl 4(%esp), %edx movl _vl_current_draw_buffer, %eax movl %ecx, (%eax,%edx,4) ret