Annotation of 43BSD/usr.lib/sendmail/src/bmove.11.s, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.