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