#ifndef NITRO_MI_MEMORY_H_ #define NITRO_MI_MEMORY_H_ #ifdef __cplusplus extern "C" { #endif #include #include void MTi_CpuClear16(u16 data, void * destp, u32 size); void MTi_CpuCopy16(const void * srcp, void * destp, u32 size); void MTi_CpuSend16(const void * srcp, volatile void * destp, u32 size); void MTi_CpuClear32(u32 data, void * destp, u32 size); void MTi_CpuCopy32(const void * srcp, void * destp, u32 size); void MTi_CpuSend32(const void * srcp, volatile void * destp, u32 size); void MTi_CpuClearFast(u32 data, void * destp, u32 size); void MTi_CpuCopy32Fast(const void * srcp, void * destp, u32 size); static inline void MI_CpuFill32 (void * dest, u32 data, u32 size) { SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0"); SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment"); MTi_CpuClear32(data, dest, size); } static inline void MI_CpuCopy32 (const void * src, void * dest, u32 size) { SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0"); SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment"); SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment"); MTi_CpuCopy32(src, dest, size); } static inline void MI_CpuClear32 (void * dest, u32 size) { MI_CpuFill32(dest, 0, size); } static inline void MI_CpuSend32 (const void * src, volatile void * dest, u32 size) { SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0"); SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment"); SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment"); MTi_CpuSend32(src, dest, size); } static inline void MI_CpuFill16 (void * dest, u16 data, u32 size) { SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0"); SDK_ASSERTMSG(((u32)dest & 1) == 0, "source address must be in 2-byte alignment"); MTi_CpuClear16(data, dest, size); } static inline void MI_CpuCopy16 (const void * src, void * dest, u32 size) { SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0"); SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment"); SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment"); MTi_CpuCopy16(src, dest, size); } static inline void MI_CpuClear16 (void * dest, u32 size) { MI_CpuFill16(dest, 0, size); } static inline void MI_CpuSend16 (const void * src, volatile void * dest, u32 size) { SDK_ASSERTMSG((size & 1) == 0, "size & 1 must be 0"); SDK_ASSERTMSG(((u32)src & 1) == 0, "source address must be in 2-byte alignment"); SDK_ASSERTMSG(((u32)dest & 1) == 0, "destination address must be in 2-byte alignment"); MTi_CpuSend16(src, dest, size); } static inline void MI_CpuFillFast (void * dest, u32 data, u32 size) { SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0"); SDK_ASSERTMSG(((u32)dest & 3) == 0, "source address must be in 4-byte alignment"); MTi_CpuClearFast(data, dest, size); } static inline void MI_CpuCopyFast (const void * src, void * dest, u32 size) { SDK_ASSERTMSG((size & 3) == 0, "size & 3 must be 0"); SDK_ASSERTMSG(((u32)src & 3) == 0, "source address must be in 4-byte alignment"); SDK_ASSERTMSG(((u32)dest & 3) == 0, "destination address must be in 4-byte alignment"); MTi_CpuCopy32Fast(src, dest, size); } static inline void MI_CpuClearFast (void * dest, u32 size) { MI_CpuFillFast(dest, 0, size); } void MI_CpuFill8(void * dest, u8 data, u32 size); void MI_CpuCopy8(const void * src, void * dest, u32 size); static inline void MI_CpuClear8 (void * dest, u32 size) { MI_CpuFill8(dest, 0, size); } #ifndef SDK_ASM #define MI_ReadWord(adrs) (*(vu32 *)(adrs)) #endif #ifndef SDK_ASM #define MI_WriteWord(adrs, val) do { (*(vu32 *)(adrs)) = (u32)(val); } while (0) #endif void MI_Copy16B(register const void * pSrc, register void * pDest); void MI_Copy32B(register const void * pSrc, register void * pDest); void MI_Copy36B(register const void * pSrc, register void * pDest); void MI_Copy48B(register const void * pSrc, register void * pDest); void MI_Copy64B(register const void * pSrc, register void * pDest); void MI_Copy128B(register const void * pSrc, register void * pDest); void MI_Zero32B(register void * pDest); void MI_Zero36B(register void * pDest); void MI_Zero48B(register void * pDest); void MI_Zero64B(register void * pDest); #ifdef __cplusplus } #endif #endif