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.
CubeSatSim/libs/libmf/source/fmemcpy.c

239 lines
4.0 KiB

#include "ax8052.h"
#include "libmftypes.h"
#if defined SDCC
/**
* \brief fast memset
*
*/
__reentrantb void fmemcpy(void __generic *d, const void __generic *s, 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 ar3,@r0
dec r0
mov ar2,@r0
dec r0
mov ar1,@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,r3
jb _B_7,00002$ ; >0x80 code
jnb _B_6,xdataptr$ ; <0x40 far
mov r0,dpl
mov dpl,r1
mov dph,r2
jnb _B_5,idataptr$ ; >0x60 pdata
ljmp pdataptr$
idataptr$:
jb acc.7,idatacodeloop$ ; >0x80 code
jnb acc.6,idataxdataloop$ ; <0x40 far
jb acc.5,idatapdataloop$ ; >0x60 pdata
idataidataloop$:
mov a,@r1
inc r1
mov @r0,a
inc r0
djnz r6,idataidataloop$
djnz r7,idataidataloop$
ret
idatapdataloop$:
movx a,@r1
inc r1
mov @r0,a
inc r0
djnz r6,idatapdataloop$
djnz r7,idatapdataloop$
ret
idataxdataloop$:
movx a,@dptr
inc dptr
mov @r0,a
inc r0
djnz r6,idataxdataloop$
djnz r7,idataxdataloop$
ret
idatacodeloop$:
clr a
movc a,@a+dptr
inc dptr
mov @r0,a
inc r0
djnz r6,idatacodeloop$
djnz r7,idatacodeloop$
ret
xdataptr$:
jb acc.7,xdatacodeloop$ ; >0x80 code
jnb acc.6,xdataxdataloop$ ; <0x40 far
jb acc.5,xdatapdataloop$ ; >0x60 pdata
xdataidataloop$:
mov a,@r1
inc r1
movx @dptr,a
inc dptr
djnz r6,xdataidataloop$
djnz r7,xdataidataloop$
ret
xdatapdataloop$:
movx a,@r1
inc r1
movx @dptr,a
inc dptr
djnz r6,xdatapdataloop$
djnz r7,xdatapdataloop$
ret
xdataxdataloop$:
push _IE
clr EA
push _DPL1
push _DPH1
mov _DPL1,r1
mov _DPH1,r2
xdataxdataloop1$:
xrl _DPS,#1
movx a,@dptr
inc dptr
xrl _DPS,#1
movx @dptr,a
inc dptr
djnz r6,xdataxdataloop1$
djnz r7,xdataxdataloop1$
pop _DPH1
pop _DPL1
pop _IE
ret
xdatacodeloop$:
push _IE
clr EA
push _DPL1
push _DPH1
mov _DPL1,r1
mov _DPH1,r2
xdatacodeloop1$:
xrl _DPS,#1
clr a
movc a,@a+dptr
xrl _DPS,#1
inc dptr
movx @dptr,a
inc dptr
djnz r6,xdatacodeloop1$
djnz r7,xdatacodeloop1$
pop _DPH1
pop _DPL1
pop _IE
ret
pdataptr$:
jb acc.7,pdatacodeloop$ ; >0x80 code
jnb acc.6,pdataxdataloop$ ; <0x40 far
jb acc.5,pdatapdataloop$ ; >0x60 pdata
pdataidataloop$:
mov a,@r1
inc r1
movx @r0,a
inc r0
djnz r6,pdataidataloop$
djnz r7,pdataidataloop$
ret
pdatapdataloop$:
movx a,@r1
inc r1
movx @r0,a
inc r0
djnz r6,pdatapdataloop$
djnz r7,pdatapdataloop$
ret
pdataxdataloop$:
movx a,@dptr
inc dptr
movx @r0,a
inc r0
djnz r6,pdataxdataloop$
djnz r7,pdataxdataloop$
ret
pdatacodeloop$:
clr a
movc a,@a+dptr
inc dptr
movx @r0,a
inc r0
djnz r6,pdatacodeloop$
djnz r7,pdatacodeloop$
ret
__endasm;
}
#elif defined __ICC8051__
__reentrantb void fmemcpy(void __generic *d, const void __generic *s, uint16_t n) __reentrant
{
uint8_t da = ((uint32_t)d)>>16;
uint8_t sa = ((uint32_t)s)>>16;
if (da & 0x80)
return;
if (da & 0x01) {
uint8_t __data *pd = (uint8_t __data *)(uint8_t)d;
if (sa & 0x80) {
const uint8_t __code *ps = (const uint8_t __code *)(uint16_t)s;
for (; n; --n)
*pd++ = *ps++;
} else if (sa & 0x01) {
const uint8_t __data *ps = (const uint8_t __data *)(uint8_t)s;
for (; n; --n)
*pd++ = *ps++;
} else {
const uint8_t __xdata *ps = (const uint8_t __xdata *)(uint16_t)s;
for (; n; --n)
*pd++ = *ps++;
}
} else {
uint8_t __xdata *pd = (uint8_t __xdata *)(uint16_t)d;
if (sa & 0x80) {
const uint8_t __code *ps = (const uint8_t __code *)(uint16_t)s;
for (; n; --n)
*pd++ = *ps++;
} else if (sa & 0x01) {
const uint8_t __data *ps = (const uint8_t __data *)(uint8_t)s;
for (; n; --n)
*pd++ = *ps++;
} else {
const uint8_t __xdata *ps = (const uint8_t __xdata *)(uint16_t)s;
for (; n; --n)
*pd++ = *ps++;
}
}
}
#else
__reentrantb void fmemcpy(void __generic *d, const void __generic *s, uint16_t n) __reentrant
{
char __generic *pd = (char __generic *)d;
const char __generic *ps = (const char __generic *)s;
for (; n; --n)
*pd++ = *ps++;
}
#endif

Powered by TurnKey Linux.