*
* clib memory manipulation routines
*

 text

 name C_memr

* char *memccpy(ptr1, ptr2, c, n)
*        char *ptr1;
*        char *ptr2;
*        int c;
*        int n;

 global _memccpy

_memccpy pshs u
 ldx 4,s ptr1
 ldu 6,s ptr2
 ldd 10,s n
 bgt 2f
 ldd #0
 puls u,pc
2 lda 0,u+
 sta 0,x+
 cmpa 9,s
 beq 4f
 ldd 10,s
 subd #1
 std 10,s
 bne 2b
3 puls u,pc
4 tfr x,d
 puls u,pc

* char *memchr(ptr, c, n)
*        char *ptr;
*        int c;
*        int n;

 global _memchr

_memchr ldd 6,s
 bgt 1f
 ldd #0
 rts
1 ldx 2,s
2 lda 0,x+
 cmpa 5,s
 beq 5f
 ldd 6,s
 subd #1
 std 6,s
 bne 2b
4 rts
5 leax -1,x
 tfr x,d
 rts

* int memcmp(ptr1, ptr2, n)
*        char *ptr1;
*        char *ptr2;
*        int n;

 global _memcmp

_memcmp ldd 6,s
 bgt 1f
 ldd #0
 rts
1 pshs u
 ldx 4,s ptr1
 ldu 6,s ptr2
2 ldb 0,x+
 cmpb 0,u+
 bne 4f
 ldd 8,s
 subd #1
 std 8,s
 bne 2b
 puls u,pc
4 subb -1,u
 sex
 puls u,pc

* char *memcpy(ptr1, ptr2, n)
*        char *ptr1;
*        char *ptr2;
*        int n;

 global _memcpy

_memcpy pshs u
 ldd 8,s
 ble 4f
 ldx 4,s ptr1
 ldu 6,s ptr2
2 lda 0,u+
 sta 0,x+
 ldd 8,s
 subd #1
 std 8,s
 bne 2b
4 ldd 4,s return ptr1
 puls u,pc

* char *memset(ptr, c, n)
*        char *ptr;
*        int c;
*        int n;

 global _memset

_memset ldd 6,s
 ble 4f
 ldx 2,s ptr
2 lda 5,s c
 sta 0,x+
 ldd 6,s
 subd #1
 std 6,s
 bne 2b
4 ldd 2,s return ptr
 rts

 end
