Annotation of researchv9/sys/sun3/movc.s, revision 1.1

1.1     ! root        1:        .data
        !             2:        .asciz  "@(#)movc.s 1.1 86/02/03 Copyr 1984 Sun Micro"
        !             3:        .even
        !             4:        .text
        !             5: 
        !             6: |      Copyright (c) 1984 by Sun Microsystems, Inc.
        !             7: 
        !             8: #include "../machine/asm_linkage.h"
        !             9: 
        !            10: | Copy a block of storage - must not overlap ( from + len <= to)
        !            11: | Usage: bcopy(from, to, count)
        !            12:        ENTRY(bcopy)
        !            13:        movl    sp@(4),a0       | from
        !            14:        movl    sp@(8),a1       | to
        !            15:        movl    sp@(12),d0      | get count
        !            16:        jle     ret             | return if not positive
        !            17: | If from address odd, move one byte to 
        !            18: | try to make things even
        !            19:        movw    a0,d1           | from
        !            20:        btst    #0,d1           | test for odd bit in from
        !            21:        jeq     1$              | even, skip
        !            22:        movb    a0@+,a1@+       | move a byte
        !            23:        subql   #1,d0           | adjust count
        !            24: | If to address is odd now, we have to do byte moves
        !            25: 1$:    movl    a1,d1           | low bit one if mutual oddness
        !            26:        btst    #0,d1           | test low bit
        !            27:        jne     bytes           | do it slow and easy
        !            28: | The addresses are now both even 
        !            29: | Now move longs
        !            30:        movl    d0,d1           | save count
        !            31:        lsrl    #2,d0           | get # longs
        !            32:        jra     3$              | enter long move loop
        !            33: | The following loop runs in loop mode on 68010
        !            34: 2$:    movl    a0@+,a1@+       | move a long
        !            35: 3$:    dbra    d0,2$           | decr, br if >= 0
        !            36: | Now up to 3 bytes remain to be moved
        !            37:        movl    d1,d0           | restore count
        !            38:        andl    #3,d0           | mod sizeof long
        !            39:        jra     bytes           | go do bytes
        !            40: 
        !            41: | Here if we have to move byte-by-byte because
        !            42: | the pointers didn't line up.  68010 loop mode is used.
        !            43: bloop: movb    a0@+,a1@+       | loop mode byte moves
        !            44: bytes: dbra    d0,bloop
        !            45: ret:   rts
        !            46: 
        !            47: | Block copy with possibly overlapped operands
        !            48:        ENTRY(ovbcopy)
        !            49:        movl    sp@(4),a0       | from
        !            50:        movl    sp@(8),a1       | to
        !            51:        movl    sp@(12),d0      | get count
        !            52:        jle     ret             | return if not positive
        !            53:        cmpl    a0,a1           | check direction of copy
        !            54:        jgt     bwd             | do it backwards
        !            55: | Here if from > to - copy bytes forward
        !            56:        jra     2$
        !            57: | Loop mode byte copy
        !            58: 1$:    movb    a0@+,a1@+
        !            59: 2$:    dbra    d0,1$
        !            60:        rts
        !            61: | Here if from < to - copy bytes backwards
        !            62: bwd:   addl    d0,a0           | get end of from area
        !            63:        addl    d0,a1           | get end of to area
        !            64:        jra     2$              | enter loop
        !            65: | Loop mode byte copy
        !            66: 1$:    movb    a0@-,a1@-
        !            67: 2$:    dbra    d0,1$
        !            68:        rts
        !            69: 
        !            70: 
        !            71: | Zero block of storage
        !            72: | Usage: bzero(addr, length)
        !            73:        ENTRY2(bzero,blkclr)
        !            74:        movl    sp@(4),a1       | address
        !            75:        movl    sp@(8),d0       | length
        !            76:        clrl    d1              | use zero register to avoid clr fetches
        !            77:        btst    #0,sp@(7)       | odd address?
        !            78:        jeq     1$              | no, skip
        !            79:        movb    d1,a1@+         | do one byte
        !            80:        subql   #1,d0           | to adjust to even address
        !            81: 1$:    movl    d0,a0           | save possibly adjusted count
        !            82:        lsrl    #2,d0           | get count of longs
        !            83:        jra     3$              | go to loop test
        !            84: | Here is the fast inner loop - loop mode on 68010
        !            85: 2$:    movl    d1,a1@+         | store long
        !            86: 3$:    dbra    d0,2$           | decr count; br until done
        !            87: | Now up to 3 bytes remain to be cleared
        !            88:        movl    a0,d0           | restore count
        !            89:        btst    #1,d0           | need a short word?
        !            90:        jeq     4$              | no, skip
        !            91:        movw    d1,a1@+         | do a short
        !            92: 4$:    btst    #0,d0           | need another byte
        !            93:        jeq     5$              | no, skip
        !            94:        movb    d1,a1@+         | do a byte
        !            95: 5$:    rts                     | all done

unix.superglobalmegacorp.com

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