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

📄 vidcopy.s

📁 Minix3.11的源码。[MINIX 3是一个为高可靠性应用而设计的自由且简洁的类UNIX系统。]
💻 S
字号:
# ! This file contains two specialized assembly code routines to update the ! video memory. The routines can copy from user to video memory, or from! video to video memory.   ! sections.sect .text; .sect .rom; .sect .data; .sect .bss! exported functions.define	_mem_vid_copy	! copy data to video ram.define	_vid_vid_copy	! move data in video ram! The routines only guarantee to preserve the registers the C compiler! expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and! direction bit in the flags)..sect .text!*===========================================================================*!*				mem_vid_copy				     *!*===========================================================================*! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count);!! Copy count characters from kernel memory to video memory.  Src is an ordinary! pointer to a word, but dst and count are character (word) based video offset! and count.  If src is null then screen memory is blanked by filling it with! blank_color._mem_vid_copy:	push	ebp	mov	ebp, esp	push	esi	push	edi	push	es	mov	esi, 8(ebp)		! source	mov	edi, 12(ebp)		! destination	mov	edx, 16(ebp)		! count	mov	es, (_vid_seg)		! segment containing video memory	cld				! make sure direction is upmvc_loop:	and	edi, (_vid_mask)	! wrap address	mov	ecx, edx		! one chunk to copy	mov	eax, (_vid_size)	sub	eax, edi	cmp	ecx, eax	jbe	0f	mov	ecx, eax		! ecx = min(ecx, vid_size - edi)0:	sub	edx, ecx		! count -= ecx	shl	edi, 1			! byte address	add	edi, (_vid_off)		! in video memory	test	esi, esi		! source == 0 means blank the screen	jz	mvc_blankmvc_copy:	rep				! copy words to video memory    o16	movs	jmp	mvc_testmvc_blank:	mov	eax, (_blank_color)	! ax = blanking character	rep    o16	stos				! copy blanks to video memory	!jmp	mvc_testmvc_test:	sub	edi, (_vid_off)	shr	edi, 1			! back to a word address	test	edx, edx	jnz	mvc_loopmvc_done:	pop	es	pop	edi	pop	esi	pop	ebp	ret!*===========================================================================*!*				vid_vid_copy				     *!*===========================================================================*! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count);!! Copy count characters from video memory to video memory.  Handle overlap.! Used for scrolling, line or character insertion and deletion.  Src, dst! and count are character (word) based video offsets and count._vid_vid_copy:	push	ebp	mov	ebp, esp	push	esi	push	edi	push	es	mov	esi, 8(ebp)		! source	mov	edi, 12(ebp)		! destination	mov	edx, 16(ebp)		! count	mov	es, (_vid_seg)		! segment containing video memory	cmp	esi, edi		! copy up or down?	jb	vvc_downvvc_up:	cld				! direction is upvvc_uploop:	and	esi, (_vid_mask)	! wrap addresses	and	edi, (_vid_mask)	mov	ecx, edx		! one chunk to copy	mov	eax, (_vid_size)	sub	eax, esi	cmp	ecx, eax	jbe	0f	mov	ecx, eax		! ecx = min(ecx, vid_size - esi)0:	mov	eax, (_vid_size)	sub	eax, edi	cmp	ecx, eax	jbe	0f	mov	ecx, eax		! ecx = min(ecx, vid_size - edi)0:	sub	edx, ecx		! count -= ecx	call	vvc_copy		! copy video words	test	edx, edx	jnz	vvc_uploop		! again?	jmp	vvc_donevvc_down:	std				! direction is down	lea	esi, -1(esi)(edx*1)	! start copying at the top	lea	edi, -1(edi)(edx*1)vvc_downloop:	and	esi, (_vid_mask)	! wrap addresses	and	edi, (_vid_mask)	mov	ecx, edx		! one chunk to copy	lea	eax, 1(esi)	cmp	ecx, eax	jbe	0f	mov	ecx, eax		! ecx = min(ecx, esi + 1)0:	lea	eax, 1(edi)	cmp	ecx, eax	jbe	0f	mov	ecx, eax		! ecx = min(ecx, edi + 1)0:	sub	edx, ecx		! count -= ecx	call	vvc_copy	test	edx, edx	jnz	vvc_downloop		! again?	cld				! C compiler expects up	!jmp	vvc_donevvc_done:	pop	es	pop	edi	pop	esi	pop	ebp	ret! Copy video words.  (Inner code of both the up and downcopying loop.)vvc_copy:	shl	esi, 1	shl	edi, 1			! byte addresses	add	esi, (_vid_off)	add	edi, (_vid_off)		! in video memory	repeseg o16 movs				! copy video words	sub	esi, (_vid_off)	sub	edi, (_vid_off)	shr	esi, 1	shr	edi, 1			! back to word addresses	ret

⌨️ 快捷键说明

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