|
|
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.