diff --git a/memory/Makefile b/memory/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..5acf059ad88e32dd3f13880565cd1dfa31fed021
--- /dev/null
+++ b/memory/Makefile
@@ -0,0 +1,81 @@
+# setup
+# modified by zerom for WinARM 8/2010
+
+COMPILE_OPTS = -mlittle-endian -mthumb -mthumb-interwork
+COMPILE_OPTS += -Wall -O2 -fno-common
+#COMPILE_OPTS += -Wall -g -fno-common
+COMPILE_OPTS += -ffreestanding -nostdlib
+
+COMPILE_OPTS_M4_FPU = -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mcpu=cortex-m4
+COMPILE_OPTS_M0 = -mfloat-abi=softfp -mcpu=cortex-m0
+COMPILE_OPTS_M0plus = -mfloat-abi=softfp -mcpu=cortex-m0plus
+COMPILE_OPTS_M3 = -mfloat-abi=softfp -mcpu=cortex-m3
+
+INCLUDE_DIRS = -I./include/ 
+
+TCHAIN_PREFIX=arm-none-eabi-
+
+CC = $(TCHAIN_PREFIX)gcc
+CFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS)
+
+AR = $(TCHAIN_PREFIX)ar
+ARFLAGS = cr
+
+MEMORY_OUT_M4_FPU = ./lib/memory_m4_fpu.a
+MEMORY_OUT_M0 = ./lib/memory_m0.a
+MEMORY_OUT_M0plus = ./lib/memory_m0plus.a
+MEMORY_OUT_M3 = ./lib/memory_m3.a
+
+SRC_DIR=./src/
+SRC=$(wildcard $(SRC_DIR)*.c)
+
+MEMORY_M4_FPU_OBJ_DIR=build/m4_fpu/
+MEMORY_M4_FPU_OBJS_TMP = $(notdir $(SRC:.c=.o))
+MEMORY_M4_FPU_OBJS = $(patsubst %,$(MEMORY_M4_FPU_OBJ_DIR)%,$(MEMORY_M4_FPU_OBJS_TMP))
+
+MEMORY_M0_OBJ_DIR=build/m0/
+MEMORY_M0_OBJS_TMP = $(notdir $(SRC:.c=.o))
+MEMORY_M0_OBJS = $(patsubst %,$(MEMORY_M0_OBJ_DIR)%,$(MEMORY_M0_OBJS_TMP))
+
+MEMORY_M0plus_OBJ_DIR=build/m0plus/
+MEMORY_M0plus_OBJS_TMP = $(notdir $(SRC:.c=.o))
+MEMORY_M0plus_OBJS = $(patsubst %,$(MEMORY_M0plus_OBJ_DIR)%,$(MEMORY_M0plus_OBJS_TMP))
+
+MEMORY_M3_OBJ_DIR=build/m3/
+MEMORY_M3_OBJS_TMP = $(notdir $(SRC:.c=.o))
+MEMORY_M3_OBJS = $(patsubst %,$(MEMORY_M3_OBJ_DIR)%,$(MEMORY_M3_OBJS_TMP))
+
+all: $(MEMORY_OUT_M4_FPU) $(MEMORY_OUT_M0) $(MEMORY_OUT_M0plus) $(MEMORY_OUT_M3)
+$(MEMORY_M4_FPU_OBJ_DIR)%.o: $(SRC_DIR)%.c
+	$(CC) -c $(CFLAGS) $(COMPILE_OPTS_M4_FPU) -o $@ $<
+$(MEMORY_M0_OBJ_DIR)%.o: $(SRC_DIR)%.c
+	$(CC) -c $(CFLAGS) $(COMPILE_OPTS_M0) -o $@ $<
+$(MEMORY_M0plus_OBJ_DIR)%.o: $(SRC_DIR)%.c
+	$(CC) -c $(CFLAGS) $(COMPILE_OPTS_M0plus) -o $@ $<
+$(MEMORY_M3_OBJ_DIR)%.o: $(SRC_DIR)%.c
+	$(CC) -c $(CFLAGS) $(COMPILE_OPTS_M3) -o $@ $<
+mkdir_build: 
+	mkdir -p build/m4_fpu
+	mkdir -p build/m0
+	mkdir -p build/m0plus
+	mkdir -p build/m3
+$(MEMORY_OUT_M4_FPU): mkdir_build $(MEMORY_M4_FPU_OBJS)
+	mkdir -p lib
+	$(AR) $(ARFLAGS) $@ $(MEMORY_M4_FPU_OBJS)
+$(MEMORY_OUT_M0): mkdir_build $(MEMORY_M0_OBJS)
+	mkdir -p lib
+	$(AR) $(ARFLAGS) $@ $(MEMORY_M0_OBJS)
+$(MEMORY_OUT_M0plus): mkdir_build $(MEMORY_M0plus_OBJS)
+	mkdir -p lib
+	$(AR) $(ARFLAGS) $@ $(MEMORY_M0plus_OBJS)
+$(MEMORY_OUT_M3): mkdir_build $(MEMORY_M3_OBJS)
+	mkdir -p lib
+	$(AR) $(ARFLAGS) $@ $(MEMORY_M3_OBJS)
+
+clean:
+	rm -f $(MEMORY_M4_FPU_OBJS)
+	rm -f $(MEMORY_M0_OBJS)
+	rm -f $(MEMORY_M0plus_OBJS)
+	rm -f $(MEMORY_M3_OBJS)
+	rm -rf lib
+	rm -rf build
diff --git a/memory/include/mem_module.h b/memory/include/mem_module.h
new file mode 100644
index 0000000000000000000000000000000000000000..f11445d7b8c5691470d420bccb24ba09ddb8180a
--- /dev/null
+++ b/memory/include/mem_module.h
@@ -0,0 +1,26 @@
+#ifndef _MEM_MODULE_H
+#define _MEM_MODULE_H
+
+#define MAX_NUM_SEGMENTS         4
+
+typedef struct
+{
+  unsigned short int start_address;
+  unsigned short int length;
+}TMemSegment;
+
+typedef struct
+{
+  unsigned char num_ram_segments;
+  TMemSegment ram_segments[MAX_NUM_SEGMENTS];
+  unsigned char num_eeprom_segments;
+  TMemSegment eeprom_segments[MAX_NUM_SEGMENTS];
+  void (*write_cmd)(unsigned short int address,unsigned short int length,unsigned char *data);
+  void (*read_cmd)(unsigned short int address,unsigned short int length,unsigned char *data);
+}TMemModule;
+
+void mem_module_init(TMemModule *module);
+void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
+void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
+
+#endif
diff --git a/memory/include/memory.h b/memory/include/memory.h
new file mode 100644
index 0000000000000000000000000000000000000000..6bfa88711d742bc6be3cd4b0da8fffec17c819ec
--- /dev/null
+++ b/memory/include/memory.h
@@ -0,0 +1,24 @@
+#ifndef _MEMORY_H
+#define _MEMORY_H
+
+#include "mem_module.h"
+
+#define MAX_NUM_MEM_MODULES       16
+#define EEPROM_SIZE               256
+#define RAM_SIZE                  4096
+
+typedef struct
+{
+  unsigned char num_mem_modules;
+  TMemModule *mem_modules[MAX_NUM_MEM_MODULES];
+  unsigned char (*eeprom_write_data)(unsigned short int address,unsigned short int data);
+  unsigned char (*eeprom_read_data)(unsigned short int address,unsigned short int *data);
+}TMemory;
+
+void mem_init(TMemory *memory);
+void mem_initialize_data(TMemory *memory);
+void mem_add_module(TMemory *memory, TMemModule *module);
+void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data);
+void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data);
+
+#endif
diff --git a/memory/src/mem_module.c b/memory/src/mem_module.c
new file mode 100644
index 0000000000000000000000000000000000000000..61d875b3d31b1fce7d1ea2773f4ca8c66ac7f471
--- /dev/null
+++ b/memory/src/mem_module.c
@@ -0,0 +1,39 @@
+#include "mem_module.h"
+
+void mem_module_init(TMemModule *module)
+{
+  unsigned char i;
+
+  module->num_ram_segments=0;
+  module->num_eeprom_segments=0;
+  for(i=0;i<MAX_NUM_SEGMENTS;i++)
+  {
+    module->ram_segments[i].start_address=0x0000;
+    module->ram_segments[i].length=0x0000;
+    module->eeprom_segments[i].start_address=0x0000;
+    module->eeprom_segments[i].length=0x0000;
+  }
+  module->write_cmd=0x00000000;
+  module->read_cmd=0x00000000;
+}
+
+void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
+{
+  if(module->num_ram_segments<MAX_NUM_SEGMENTS-1)
+  {
+    module->ram_segments[module->num_ram_segments].start_address=start_address;
+    module->ram_segments[module->num_ram_segments].length=length;
+    module->num_ram_segments++;
+  }
+}
+
+void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
+{
+  if(module->num_eeprom_segments<MAX_NUM_SEGMENTS-1)
+  {
+    module->eeprom_segments[module->num_eeprom_segments].start_address=start_address;
+    module->eeprom_segments[module->num_eeprom_segments].length=length;
+    module->num_eeprom_segments++;
+  }
+}
+
diff --git a/memory/src/memory.c b/memory/src/memory.c
new file mode 100644
index 0000000000000000000000000000000000000000..359c276c05ae48367d909c25299a735b7e933b7b
--- /dev/null
+++ b/memory/src/memory.c
@@ -0,0 +1,124 @@
+#include "memory.h"
+#include "mem_module.h"
+
+/* private functions */
+unsigned char mem_in_window(unsigned short int mem_start_address,unsigned short int mem_length,unsigned short int start_address,unsigned short int length)
+{
+  unsigned short int end_mem=mem_start_address+mem_length;
+  unsigned short int end_address=start_address+length;
+
+  if((mem_start_address>=start_address && mem_start_address<end_address) || 
+     (end_mem>=start_address && end_mem<end_address) ||
+     (start_address>=mem_start_address && start_address<end_mem) || 
+     (end_address>=mem_start_address && end_address<end_mem))
+    return 0x01;
+  else
+    return 0x00;
+}
+
+/* public functions */
+void mem_init(TMemory *memory)
+{
+  unsigned char i;
+
+  memory->num_mem_modules=0;
+  for(i=0;i<MAX_NUM_MEM_MODULES;i++)
+    memory->mem_modules[i]=0x00000000;
+  memory->eeprom_write_data=0x00000000;
+  memory->eeprom_read_data=0x00000000;
+}
+
+void mem_initialize_data(TMemory *memory)
+{
+  TMemModule *mem_module;
+  unsigned short data;
+  unsigned short int i,j;
+  unsigned char eeprom_data[EEPROM_SIZE];
+
+  if(memory->eeprom_read_data!=0x00000000)
+  {
+    for(i=0;i<EEPROM_SIZE;i++)
+    {
+      memory->eeprom_read_data(i,&data);
+      eeprom_data[i]=data&0x00FF;
+    }
+    for(i=0;i<memory->num_mem_modules;i++)
+    {
+      mem_module=memory->mem_modules[i];
+      for(j=0;j<mem_module->num_eeprom_segments;j++)
+      {
+        if(mem_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[i].length,0x0000,EEPROM_SIZE))
+        {
+          if(mem_module->write_cmd!=0x00000000)
+           mem_module->write_cmd(0x0000,EEPROM_SIZE,eeprom_data);
+        }
+      }
+    }
+  }
+}
+
+void mem_add_module(TMemory *memory, TMemModule *module)
+{
+  if(memory->num_mem_modules<MAX_NUM_MEM_MODULES-1)
+  {
+    memory->mem_modules[memory->num_mem_modules]=module;
+    memory->num_mem_modules++;
+  }
+}
+
+void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data)
+{
+  TMemModule *mem_module;
+  unsigned char i,j,k;
+
+  for(i=0;i<memory->num_mem_modules;i++)
+  {
+    mem_module=memory->mem_modules[i];
+    for(j=0;j<mem_module->num_ram_segments;j++)
+    {
+      if(mem_in_window(mem_module->ram_segments[j].start_address,mem_module->ram_segments[i].length,start_address,length))
+      {
+        if(mem_module->write_cmd!=0x00000000)
+          mem_module->write_cmd(start_address,length,data);
+      }
+    }
+    for(j=0;j<mem_module->num_eeprom_segments;j++)
+    {
+      if(mem_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[i].length,start_address,length))
+      {
+        if(mem_module->write_cmd!=0x00000000)
+          mem_module->write_cmd(start_address,length,data);
+        if(memory->eeprom_write_data!=0x00000000)
+          for(k=start_address;k<EEPROM_SIZE || k<start_address+length;k++)
+            memory->eeprom_write_data(k,data[start_address-mem_module->eeprom_segments[j].start_address]);
+      }
+    }
+  }
+}
+
+void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data)
+{
+  TMemModule *mem_module;
+  unsigned char i,j;
+
+  for(i=0;i<memory->num_mem_modules;i++)
+  {
+    mem_module=memory->mem_modules[i];
+    for(j=0;j<mem_module->num_ram_segments;j++)
+    {
+      if(mem_in_window(mem_module->ram_segments[j].start_address,mem_module->ram_segments[i].length,start_address,length))
+      {
+        if(mem_module->read_cmd!=0x00000000)
+          mem_module->read_cmd(start_address,length,data);
+      }
+    }
+    for(j=0;j<mem_module->num_eeprom_segments;j++)
+    {
+      if(mem_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[i].length,start_address,length))
+      {
+        if(mem_module->read_cmd!=0x00000000)
+          mem_module->read_cmd(start_address,length,data);
+      }
+    }
+  }
+}
diff --git a/memory/test/Makefile b/memory/test/Makefile
new file mode 100755
index 0000000000000000000000000000000000000000..4c69e9f649753d404f14bbccfd06b45dda47e302
--- /dev/null
+++ b/memory/test/Makefile
@@ -0,0 +1,36 @@
+# setup
+# modified by zerom for WinARM 8/2010
+
+PROJECT_NAME=memory_test
+TARGET_FILES=$(wildcard *.c)
+TARGET_FILES+=$(wildcard ../src/*.c)
+BUILD_PATH=build
+BIN_PATH=bin
+
+INCLUDE_DIRS = -I../include 
+
+CC = gcc
+
+UTILS_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o))
+UTILS_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(UTILS_OBJS_TMP))
+
+OUT_FILE=$(BIN_PATH)/$(PROJECT_NAME)
+
+all: $(OUT_FILE)
+
+make_dirs: 
+	mkdir -p $(BUILD_PATH)
+	mkdir -p $(BIN_PATH)
+
+$(BUILD_PATH)/%.o: %.c
+	$(CC) -c -g $(INCLUDE_DIRS) -o $@ $<
+
+$(BUILD_PATH)/%.o: ../src/%.c
+	$(CC) -c -g $(INCLUDE_DIRS) -o $@ $<
+
+$(OUT_FILE): make_dirs $(UTILS_OBJS) 
+	$(CC) -g $(UTILS_OBJS) -lpthread --output $@
+
+clean:
+	-rm -rf $(BUILD_PATH)
+	-rm -rf $(BIN_PATH)
diff --git a/memory/test/memory_test.c b/memory/test/memory_test.c
new file mode 100644
index 0000000000000000000000000000000000000000..20d7efc7d142f65a02f2728bc5f8b6ba0721a26a
--- /dev/null
+++ b/memory/test/memory_test.c
@@ -0,0 +1,56 @@
+#include "mem_module.h"
+#include "memory.h"
+
+void module1_init_mem(unsigned char init_eeprom)
+{
+
+}
+
+void module1_write_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data)
+{
+
+}
+
+void module1_read_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data)
+{
+
+}
+
+void module2_init_mem(unsigned char init_eeprom)
+{
+
+}
+
+void module2_write_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data)
+{
+
+}
+
+void module2_read_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data)
+{
+
+}
+
+int main(void)
+{
+  TMemory memory;
+  TMemModule module1;
+  TMemModule module2;
+
+  mem_module_init(&module1);
+  module1.write_cmd=module1_write_cmd;
+  module1.read_cmd=module1_read_cmd;
+  mem_module_init(&module2);
+  module2.write_cmd=module2_write_cmd;
+  module2.read_cmd=module2_read_cmd;
+  mem_init(&memory);
+  
+  mem_module_add_ram_segment(&module1,0x0000,0x0005);
+  mem_module_add_ram_segment(&module1,0x0055,0x000A);
+  mem_module_add_eeprom_segment(&module1,0x0100,0x0020);
+  mem_add_module(&memory,&module1);
+
+  mem_module_add_ram_segment(&module2,0x0200,0x0005);
+  mem_module_add_eeprom_segment(&module2,0x0180,0x0020);
+  mem_add_module(&memory,&module2);
+}