⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blit.s

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 S
📖 第 1 页 / 共 2 页
字号:
/* * 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -