1: /
   2: /  BMOVE -- block move
   3: /
   4: /	@(#)bmove.11.s	2.1	11/5/80
   5: /
   6: /	This is a highly optimized version of the old C-language
   7: /	bmove routine; it's function (should be) identical.
   8: /	It uses a fancy algorithm to move words instead of bytes
   9: /	whenever possible.
  10: /
  11: /	In C the routine is:
  12: /		char *bmove(a, b, l)
  13: /		char	*a, *b;
  14: /		int	l;
  15: /		{
  16: /			register int	n;
  17: /			register char	*p, *q;
  18: /			p = a;
  19: /			q = b;
  20: /			n = l;
  21: /			while (n--)
  22: /				*q++ = *p++;
  23: /			return (q);
  24: /		}
  25: /
  26: /	Parameters:
  27: /		a [4(sp)] -- source area
  28: /		b [6(sp)] -- target area
  29: /		l [10(sp)] -- byte count
  30: /
  31: /	Returns:
  32: /		Pointer to end of target area.
  33: /
  34: /	History:
  35: /		3/14/79 [rse] -- added odd to odd case
  36: /		2/9/78 [bob] -- converted from "C"
  37: /
  38: /
  39: 
  40: .globl  _bmove
  41: 
  42: _bmove:
  43:         mov     r2,-(sp)        / save r2
  44:         mov     4(sp),r1        / get src address
  45:         mov     6(sp),r0        / get dst address
  46: 
  47:         / determine whether to use word or byte move
  48:         mov     r0,r2           / r2 will reflect the three cases
  49:         bic     $177776,r2      / keep only last bit of dst
  50:         ror     4(sp)           / get least significant bit of src
  51:         adc     r2              / add it in.
  52:         beq     wordm           / both on even boundary
  53:         dec     r2              / check for odd case
  54:         bgt     wordodd         / both on odd boundary
  55: 
  56:         mov     10(sp),r2       / get count
  57:         beq     done
  58: bytem:
  59:         movb    (r1)+,(r0)+     / copy next byte
  60:         sob     r2,bytem        / branch until done
  61:         br      done
  62: 
  63: wordm:
  64:         mov     10(sp),r2       / get count
  65: wordt:
  66:         beq     done
  67:         asr     r2              / get word count
  68:         bcs     odd             / count was odd
  69: even:
  70:         mov     (r1)+,(r0)+     / copy word
  71:         sob     r2,even         / more to do if non-zero
  72:         br      done
  73: 
  74: wordodd:
  75:         mov     10(sp),r2       / get count
  76:         beq     done
  77:         movb    (r1)+,(r0)+     / copy byte
  78:         dec     r2              / dec count
  79:         br      wordt           / now treat as an even word move
  80: 
  81: odd:
  82:         beq     odd2            / special case of count = 1
  83: odd1:
  84:         mov     (r1)+,(r0)+     / copy word
  85:         sob     r2,odd1         / continue
  86: odd2:
  87:         movb    (r1)+,(r0)+     / count was odd. do last one
  88: 
  89: done:
  90:         mov     (sp)+,r2        / restore r2
  91:         rts     pc              / return

Defined functions

_bmove declared in line 40; defined in line 42; used 1 times
  • in line 40
bytem defined in line 58; used 1 times
  • in line 60
done defined in line 89; used 5 times
even defined in line 69; used 1 times
  • in line 71
odd defined in line 81; used 1 times
  • in line 68
odd1 defined in line 83; used 1 times
  • in line 85
odd2 defined in line 86; used 1 times
  • in line 82
wordm defined in line 63; used 1 times
  • in line 52
wordodd defined in line 74; used 1 times
  • in line 54
wordt defined in line 65; used 1 times
  • in line 79
Last modified: 1981-02-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 483
Valid CSS Valid XHTML 1.0 Strict