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

📄 blt.s,v

📁 TCP-IP红宝书源代码
💻 S,V
字号:
head	1.1;
access;
symbols;
locks
	dls:1.1; strict;
comment	@# @;


1.1
date	97.09.21.19.27.40;	author dls;	state Dist;
branches;
next	;


desc
@@


1.1
log
@pre-3e code
@
text
@|Block transfer subroutine: blt(destination, source, count), returns count

	.globl	blt
	.text

blt:	movl	sp@@(4),a0	|destination
	movl	sp@@(8),a1	|source
	movl	a0,d0		|destination
	andl	#1,d0		|see if word aligned
	movl	a1,d1		|source
	andl	#1,d1		|see if long word aligned?
	cmpl	d0,d1		|do they agree?
	beq	1$		|yes, can do something interesting
	movl	sp@@(12),d1	|count
	bra	5$		|ho, hum, just do byte moves
1$:	movl	sp@@(12),d1	|count
	tstl	d0		|are we on a long boundry?
	beq	3$		|yes, don't worry about fudge
	negl	d0		|complement
	addql	#2,d0		|2 - adjustment = fudge
	cmpl	d1,d0		|is count bigger than fudge
	bge	5$		|no, must be 3 bytes or less
	subl	d0,d1		|shrink remaining count by this much
	subql	#1,d0		|dbf is a crock
2$:	movb	a1@@+,a0@@+	|move bytes to get to long boundry
	subql	#1,d0
	bge	2$		|while alignment count
3$:	movl	d1,d0		|copy remaining count
	andl	#~3,d0		|count mod 4 is number of long words
	beq	5$		|hmm, must not be any
	subl	d0,d1		|long words moved * 4 = bytes moved
	asrl	#2,d0		|number of long words
	cmpl	#12,d0		|do we have a bunch to do?
	blt	38$		|no, just do normal moves
	moveml	#0x7F3E,sp@@-	|save some registers
34$:	moveml	a1@@+,#0x7CFE	|block move via various registers
	moveml	#0x7CFE,a0@@
	addl	#48,a0		|moveml won't let me auto inc a destination
	subl	#12,d0		|we moved twelve longs worth
	cmpl	#12,d0		|do we have another 12 to go
	bge	34$		|yes, keep at it
	moveml	sp@@+,#0x7CFE	|restore registers
	tstl	d0		|any long's left
	beq	5$		|no, nothing but a few random bytes
38$:	subql	#1,d0		|dbf is a crock
4$:	movl	a1@@+,a0@@+	|copy as many long words as possible
	subql	#1,d0
	bge	4$		|while long word count
5$:	tstl	d1		|anything left to do?
	beq	7$		|nothing left
	subql	#1,d1		|dbf is a crock
6$:	movb	a1@@+,a0@@+	|copy any residual bytes
	subql	#1,d1
	bge	6$		|while byte count
7$:	movl	sp@@(12),d0	|just return the count
	rts
@

⌨️ 快捷键说明

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