|
|
1.1 ! root 1: ////////// ! 2: / i8086 C string library internals. ! 3: / _memxchg() ! 4: / Exchange records of Count bytes pointed to by S1 and S2. ! 5: ////////// ! 6: ! 7: ////////// ! 8: / void _memxchg(char *S1, char *S2, size_t Count) ! 9: ////////// ! 10: ! 11: #include <larges.h> ! 12: ! 13: S1 = LEFTARG ! 14: S2 = S1+DPL ! 15: Count = S2+DPL ! 16: ! 17: Enter(_memxchg_) ! 18: mov cx, Count(bp) / Count to CX ! 19: jcxz 2f / Done if Count is 0 ! 20: ! 21: Lds si, S2(bp) / S2 address to DS:SI ! 22: Les di, S1(bp) / S1 address to ES:DI ! 23: cld ! 24: shr cx, $1 / Convert byte count to word count ! 25: jnc 1f / Count even, skip byte exchange ! 26: ! 27: movb al, Pes (di) / S1 byte to AL ! 28: movsb / S2 byte to S1, bump DI and SI ! 29: movb -1(si), al / S1 byte to old S2 ! 30: jz 2f / Done if Count is 0 ! 31: ! 32: 1: ! 33: mov ax, Pes (di) / S1 word to AX ! 34: movs / S2 word to S1, bump DI and SI ! 35: mov -2(si), ax / S1 word to old S2 ! 36: loop 1b / Decrement byte count and repeat ! 37: ! 38: 2: ! 39: Leave
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.