//包含头文件
#include "ram.h"

//190228-RAM---------（2/3）---------------------------


//======================================================================
//函数名称：ram_read
//函数返回：1:地址合法；0：地址不合法
//参数说明：dest：读出数据存放处（地址合法，存放读取的数据；地址不合法，0~3个字节以小端格式存放USER的
//                       RAM起始地址，4~7个字节以小端格式存放USER的RAM终止地址）
//       addr：目标地址，范围RAM_START~RAM_END-N
//       N：读字节数目
//功能概要：读取ram指定地址的N个字节的内容(绝对地址读取)
//======================================================================
uint_8 ram_read(uint_8 *dest,uint_32 addr,uint_32 N)
{
	uint_8 *src;
	src=(uint_8 *)addr;
	if((addr>=RAM_START)&&(addr<=(RAM_END-N)))
	{
		//地址合法，则拷贝数据
		memcpy(dest,src,N);
		return 1;
	}
	else
	{
		//地址不合法
		//0~3个字节以小端格式存放USER的RAM起始地址
        dest[0]=(uint_8)(RAM_START);
        dest[1]=(uint_8)(RAM_START>>8);
        dest[2]=(uint_8)(RAM_START>>16);
        dest[3]=(uint_8)(RAM_START>>24);
        //4~7个字节以小端格式存放USER的RAM终止地址
        dest[4]=(uint_8)(RAM_END-N);
        dest[5]=(uint_8)((RAM_END-N)>>8);
        dest[6]=(uint_8)((RAM_END-N)>>16);
        dest[7]=(uint_8)((RAM_END-N)>>24);
		return 0;
	}
}

//======================================================================
//函数名称：ram_read_offset
//函数返回：1:地址合法；0：地址不合法
//参数说明：dest：读出数据存放处（地址合法，存放读取的数据；地址不合法，0~3个字节以小端格式
//                                                存放USER的RAM长度）
//       addr：目标地址（相对RAM_START的偏移量），范围0~（RAM_END-RAM_START-N）
//       N：读字节数目
//功能概要：读取ram指定地址的N个字节的内容(相对地址读取)
//======================================================================
uint_8 ram_read_offset(uint_8 *dest,uint_32 addr,uint_32 N)
{
	uint_8 *src;
	src=(uint_8 *)(addr+RAM_START);
	if(addr<=(RAM_END-RAM_START-N))
	{
		//地址合法
		memcpy(dest,src,N);
		return 1;
	}
	else
	{
		//地址不合法
		//0~3个字节以小端格式存放USER的RAM长度
		dest[0]=(uint_8)(RAM_END-RAM_START-N);
		dest[1]=(uint_8)((RAM_END-RAM_START-N)>>8);
		dest[2]=(uint_8)((RAM_END-RAM_START-N)>>16);
		dest[3]=(uint_8)((RAM_END-RAM_START-N)>>24);
		return 0;
	}
}
//----------------------------------------
