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;
+}