136 lines
1.9 KiB
ArmAsm
136 lines
1.9 KiB
ArmAsm
|
/*
|
||
|
* 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
|