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