1/*
2 * memset routine for Z8000
3 * Copyright (C) 2004 Christian Groessler <chris@groessler.org>
4 *
5 * Permission to use, copy, modify, and distribute this file
6 * for any purpose is hereby granted without fee, provided that
7 * the above copyright notice and this notice appears in all
8 * copies.
9 *
10 * This file is distributed WITHOUT ANY WARRANTY; without even the implied
11 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 */
13
14/* void *memset(void *buffer, int value, size_t length);
15 */
16
17#include <picolibc.h>
18
19	name	"memset.S"
20
21	.text
22	even
23global	_memset
24
25_memset:
26
27#ifdef __Z8001__
28	segm
29
30#ifdef __STD_CALL__
31	ldl	rr6,rr14(#4)
32	ld	r5,rr14(#8)
33	ldl	rr2,rr14(#10)
34#else
35	pushl	@rr14,rr6
36#endif
37
38/* rr2  - length
39 * rl5  - value
40 * rr6  - buffer
41 */
42	testl	rr2
43	jr	z,finish
44
45	ldb	rh5,rl5
46	ld	r1,r5		/* r1 contains value */
47	bit	r7,#0
48	jr	z,not_odd
49
50	ldb	@rr6,rl1
51	inc	r7,#1
52	subl	rr2,#1
53	jr	z,finish
54
55not_odd:ld	r0,r3		/* remember length */
56	srl	r3,#1
57	jr	z,no_words
58
59	ldl	rr4,rr6
60	ld	@rr6,r1
61	inc	r7,#2
62	dec	r3,#1
63	jr	z,no_words
64
65	ldir	@rr6,@rr4,r3	/* fill words */
66
67no_words:
68	bit	r0,#0		/* one byte remaining? */
69	jr	z,finish
70
71	ldb	@rr6,rl1
72
73finish:
74#ifdef __STD_CALL__
75	ldl	rr6,rr14(#4)
76#else
77	popl	rr2,@rr14
78#endif
79
80
81#else		/* above Z8001, below Z8002 */
82
83
84	unsegm
85
86#ifdef __STD_CALL__
87	ld	r7,r15(#2)
88	ld	r6,r15(#4)
89	ld	r5,r15(#6)
90#else
91	ld	r2,r7		/* buffer pointer return value */
92#endif
93
94/* r5  - length
95 * r6  - value
96 * r7  - buffer
97 */
98	test	r5
99	jr	z,finish
100
101	ldb	rh6,rl6
102	ld	r1,r6		/* r1 contains value */
103	bit	r7,#0
104	jr	z,not_odd
105
106	ldb	@r7,rl1
107	inc	r7,#1
108	dec	r5,#1
109	jr	z,finish
110
111not_odd:ld	r0,r5		/* remember length */
112	srl	r5,#1
113	jr	z,no_words
114
115	ld	r4,r7
116	ld	@r7,r1
117	inc	r7,#2
118	dec	r5,#1
119	jr	z,no_words
120
121	ldir	@r7,@r4,r5	/* fill words */
122
123no_words:
124	bit	r0,#0		/* one byte remaining? */
125	jr	z,finish
126
127	ldb	@r7,rl1
128
129finish:
130#ifdef __STD_CALL__
131	ld	r7,r15(#2)
132#endif
133
134#endif	/* Z8002 */
135
136	ret
137	.end
138