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 2 times
bytem
defined in line
58; used 1 times
done
defined in line
89; used 5 times
even
defined in line
69; used 1 times
odd
defined in line
81; used 1 times
odd1
defined in line
83; used 1 times
odd2
defined in line
86; used 1 times
wordm
defined in line
63; used 1 times
wordt
defined in line
65; used 1 times