You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
1.5 KiB
111 lines
1.5 KiB
#include "ax8052.h"
|
|
#include "libmftypes.h"
|
|
|
|
#if defined SDCC
|
|
|
|
/**
|
|
* \brief fast memset
|
|
*
|
|
*/
|
|
__reentrantb void fmemset(void __generic *p, char c, uint16_t n) __reentrant __naked
|
|
{
|
|
__asm
|
|
ar2=0x02
|
|
ar3=0x03
|
|
ar4=0x04
|
|
ar5=0x05
|
|
ar6=0x06
|
|
ar7=0x07
|
|
ar0=0x00
|
|
ar1=0x01
|
|
|
|
mov r0,sp
|
|
dec r0
|
|
dec r0
|
|
mov ar5,@r0
|
|
dec r0
|
|
mov ar7,@r0
|
|
dec r0
|
|
mov a,@r0
|
|
mov r6,a
|
|
jnz 00001$
|
|
orl a,r7
|
|
jnz 00000$
|
|
00002$: ret
|
|
00001$: inc r7
|
|
00000$: ;; decide memory space
|
|
mov a,r5
|
|
jb _B_7,00002$ ; >0x80 code
|
|
jnb _B_6,xdataloop$ ; <0x40 far
|
|
mov r0,dpl
|
|
jb _B_5,pdataloop$ ; >0x60 pdata
|
|
idataloop$:
|
|
mov @r0,a
|
|
inc r0
|
|
djnz r6,idataloop$
|
|
djnz r7,idataloop$
|
|
ret
|
|
pdataloop$:
|
|
movx @r0,a
|
|
inc r0
|
|
djnz r6,pdataloop$
|
|
djnz r7,pdataloop$
|
|
ret
|
|
xdataloop$:
|
|
movx @dptr,a
|
|
inc dptr
|
|
djnz r6,xdataloop$
|
|
djnz r7,xdataloop$
|
|
ret
|
|
__endasm;
|
|
}
|
|
|
|
#elif defined __ICC8051__
|
|
|
|
__reentrantb void fmemset(void __generic *p, char c, uint16_t n) __reentrant
|
|
{
|
|
union ptr {
|
|
void __generic *p;
|
|
uint8_t __data *pd;
|
|
uint8_t __xdata *px;
|
|
uint8_t b[3];
|
|
};
|
|
union ptr pp;
|
|
uint8_t pa;
|
|
uint8_t n0 = n, n1 = n >> 8;
|
|
if (n0)
|
|
++n1;
|
|
else if (!n1)
|
|
return;
|
|
pp.p = p;
|
|
pa = pp.b[2];
|
|
if (pa & 0x80)
|
|
return;
|
|
if (pa & 0x01) {
|
|
uint8_t __data *p1 = pp.pd;
|
|
do {
|
|
do {
|
|
*p1++ = c;
|
|
} while (--n0);
|
|
} while (--n1);
|
|
} else {
|
|
uint8_t __xdata *p1 = pp.px;
|
|
do {
|
|
do {
|
|
*p1++ = c;
|
|
} while (--n0);
|
|
} while (--n1);
|
|
}
|
|
}
|
|
|
|
#else
|
|
|
|
__reentrantb void fmemset(void __generic *p, char c, uint16_t n) __reentrant
|
|
{
|
|
char __generic *pp = (char __generic *)p;
|
|
for (; n; --n)
|
|
*pp++ = c;
|
|
}
|
|
|
|
#endif
|