diff --git a/memory/include/ram.h b/memory/include/ram.h new file mode 100644 index 0000000000000000000000000000000000000000..ecc663695a1d6fa81089cbc8ee53c41889b9e683 --- /dev/null +++ b/memory/include/ram.h @@ -0,0 +1,34 @@ +#ifndef _RAM_H +#define _RAM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "memory.h" + +#define RAM_SUCCESS 0 +#define RAM_BAD_ADDRESS -1 +#define RAM_WRITE_ERROR -2 +#define RAM_BAD_BIT -3 +#define RAM_BAD_ACCESS -4 + +extern unsigned char ram_data[RAM_SIZE]; + +unsigned char ram_init(TMemory *memory); +inline void ram_read_byte(unsigned short int address, unsigned char *data); +inline void ram_read_word(unsigned short int address, unsigned short int *data); +unsigned char ram_read_table(unsigned short int address, unsigned short int length,unsigned char *data); +unsigned char ram_set_bit(unsigned short int address, unsigned char bit); +unsigned char ram_clear_bit(unsigned short int address, unsigned char bit); +unsigned char ram_write_byte(unsigned short int address, unsigned char data); +unsigned char ram_write_word(unsigned short int address, unsigned short int data); +unsigned char ram_write_table(unsigned short int address, unsigned short int length,unsigned char *data); +inline unsigned char ram_in_range(unsigned short int reg,unsigned short int address,unsigned short int length); +unsigned char ram_in_window(unsigned short int start_reg,unsigned short int reg_length,unsigned short int start_address,unsigned short int address_length); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/memory/src/ram.c b/memory/src/ram.c new file mode 100644 index 0000000000000000000000000000000000000000..39f442a6abee2795534bc20e2d95c5225c6ad8fe --- /dev/null +++ b/memory/src/ram.c @@ -0,0 +1,110 @@ +#include "ram.h" + +unsigned char ram_data[RAM_SIZE]={0}; + +unsigned char ram_init(TMemory *memory) +{ + mem_initialize_data(memory); + + return 0x01; +} + +inline void ram_read_byte(unsigned short int address,unsigned char *data) +{ + (*data)=ram_data[address]; +} + +inline void ram_read_word(unsigned short int address, unsigned short int *data) +{ + (*data)=ram_data[address]; + (*data)+=ram_data[address+1]*256; +} + +unsigned char ram_read_table(unsigned short int address, unsigned short int length,unsigned char *data) +{ + unsigned short int i; + + if((address+length)<=(RAM_SIZE-1)) + { + for(i=0;i<length;i++) + data[i]=ram_data[address+i]; + return RAM_SUCCESS; + } + else + return RAM_BAD_ADDRESS; +} + +unsigned char ram_set_bit(unsigned short int address, unsigned char bit) +{ + if(bit>=0 && bit<8) + { + ram_data[address]|=(0x01<<bit); + return RAM_SUCCESS; + } + else + return RAM_BAD_BIT; +} + +unsigned char ram_clear_bit(unsigned short int address, unsigned char bit) +{ + if(bit>=0 && bit<8) + { + ram_data[address]&=(~(0x01<<bit)); + return RAM_SUCCESS; + } + else + return RAM_BAD_BIT; +} + +unsigned char ram_write_byte(unsigned short int address, unsigned char data) +{ + ram_data[address]=data; + + return RAM_SUCCESS; +} + +unsigned char ram_write_word(unsigned short int address, unsigned short int data) +{ + if(address < (RAM_SIZE-1)) + { + ram_data[address]=data%256; + ram_data[address+1]=data/256; + + return RAM_SUCCESS; + } + else + return RAM_BAD_ADDRESS; +} + +unsigned char ram_write_table(unsigned short int address, unsigned short int length,unsigned char *data) +{ + unsigned short int i; + + if((address+length)<RAM_SIZE) + { + for(i=0;i<length;i++) + ram_data[address+i]=data[i]; + return RAM_SUCCESS; + } + else + return RAM_BAD_ADDRESS; +} + +inline unsigned char ram_in_range(unsigned short int reg,unsigned short int address,unsigned short int length) +{ + if(reg>=address && reg<(address+length)) + return 0x01; + else + return 0x00; +} + +unsigned char ram_in_window(unsigned short int start_reg,unsigned short int reg_length,unsigned short int start_address,unsigned short int address_length) +{ + unsigned short int end_reg=start_reg+reg_length-1; + unsigned short int end_address=start_address+address_length-1; + + if((start_reg>=start_address && start_reg<=end_address) || (end_reg>=start_address && end_reg<=end_address)) + return 0x01; + else + return 0x00; +}