|
|
1.1 ! root 1: ////////// ! 2: / MSDOS MWC86 runtime. ! 3: / Copy memory. ! 4: / ANSI 4.11.2.2. ! 5: ////////// ! 6: ! 7: //////// ! 8: / Copy a block of memory from one ! 9: / place in the physical address space to ! 10: / another place in the physical address space. ! 11: / Copy backwards if the source precedes the destination in memory. ! 12: / ! 13: / char * ! 14: / memmove(dst, src, nbytes) ! 15: / char *dst, *src; ! 16: / int nbytes; ! 17: //////// ! 18: ! 19: #include <larges.h> ! 20: ! 21: dst = LEFTARG / destination ! 22: src = dst+DPL / source ! 23: nbytes = src+DPL / byte count ! 24: ! 25: c16: .word 16 / Constant for multiply ! 26: ! 27: Enter(memmove_) ! 28: Les di, dst(bp) / Load ES:DI with destination. ! 29: mov cx, nbytes(bp) / Pick up byte count. ! 30: jcxz 4f / No work, return dst. ! 31: ! 32: cld / Set forward copy bit. ! 33: Lds si, src(bp) / Load DS:SI with source. ! 34: ! 35: #if LARGEDATA ! 36: / LARGE model requires some computation to deduce whether ! 37: / the source precedes the destination. ! 38: mov ax, ds ! 39: mov bx, es ! 40: sub ax, bx / src segment - dst segment ! 41: jne 0f / Segments match, ! 42: cmp si, di / just compare offsets. ! 43: jmp 1f ! 44: 0: imul cs:c16 / Convert paragraph difference to bytes. ! 45: add ax, si / Add in source offset ! 46: adc dx, $0 ! 47: sub ax, di / and subtract destination offset. ! 48: sbb dx, $0 ! 49: jne 2f / High word of difference is nonzero. ! 50: cmp ax, $0 ! 51: #else ! 52: / SMALL model can just compare offsets. ! 53: cmp si, di / Compare offsets. ! 54: #endif ! 55: 1: jz 4f / src == dest, return dst. ! 56: 2: jae 3f / src > dest, copy forward. ! 57: add si, cx / src < dest, ! 58: add di, cx / copy backward. ! 59: dec si / Find end of src ! 60: dec di / and end of dest ! 61: std / and set flag for backward copy. ! 62: 3: ! 63: rep / Copy the ! 64: movsb / block of bytes. ! 65: 4: ! 66: cld / Clear direction flag for DOS. ! 67: mov ax, dst(bp) / return the destination ! 68: #if LARGEDATA ! 69: mov dx, es ! 70: #endif ! 71: Leave
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.