From 0dd2f7dfdcf8833a73c3fd7839de53f1736aa24b Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Fri, 4 Oct 2019 10:23:20 +0200
Subject: [PATCH] Used the device ID to access the EEPROM memory. Removed the
 global ram_data variable. Added an independant data vector for each memory
 instance.

---
 memory/include/memory.h |  6 +++++-
 memory/include/ram.h    | 18 ++++++++----------
 memory/src/memory.c     | 27 ++++++++++++---------------
 memory/src/ram.c        | 38 ++++++++++++++++++--------------------
 4 files changed, 43 insertions(+), 46 deletions(-)

diff --git a/memory/include/memory.h b/memory/include/memory.h
index 1829fee..e01445f 100644
--- a/memory/include/memory.h
+++ b/memory/include/memory.h
@@ -15,11 +15,15 @@ typedef struct
 {
   unsigned char num_mem_modules;
   TMemModule *mem_modules[MAX_NUM_MEM_MODULES];
+  unsigned char device_id;
   unsigned short int (*eeprom_write_data)(unsigned short int address,unsigned short int data);
   unsigned short int (*eeprom_read_data)(unsigned short int address,unsigned short int *data);
+  unsigned char data[RAM_SIZE];
+  unsigned char total_eeprom;
+  unsigned char total_ram;
 }TMemory;
 
-void mem_init(TMemory *memory);
+void mem_init(TMemory *memory,unsigned char device_id);
 void mem_initialize_data(TMemory *memory);
 unsigned char 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);
diff --git a/memory/include/ram.h b/memory/include/ram.h
index ecc6636..1aa611f 100644
--- a/memory/include/ram.h
+++ b/memory/include/ram.h
@@ -13,17 +13,15 @@ extern "C" {
 #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 void ram_read_byte(TMemory *memory,unsigned short int address, unsigned char *data);
+inline void ram_read_word(TMemory *memory,unsigned short int address, unsigned short int *data);
+unsigned char ram_read_table(TMemory *memory,unsigned short int address, unsigned short int length,unsigned char *data);
+unsigned char ram_set_bit(TMemory *memory,unsigned short int address, unsigned char bit);
+unsigned char ram_clear_bit(TMemory *memory,unsigned short int address, unsigned char bit);
+unsigned char ram_write_byte(TMemory *memory,unsigned short int address, unsigned char data);
+unsigned char ram_write_word(TMemory *memory,unsigned short int address, unsigned short int data);
+unsigned char ram_write_table(TMemory *memory,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);
 
diff --git a/memory/src/memory.c b/memory/src/memory.c
index 68fbc80..af30fbf 100644
--- a/memory/src/memory.c
+++ b/memory/src/memory.c
@@ -1,10 +1,6 @@
 #include "memory.h"
 #include "mem_module.h"
 
-/* private variables */
-unsigned char memory_total_eeprom;
-unsigned char memory_total_ram;
-
 /* 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)
 {
@@ -21,7 +17,7 @@ unsigned char mem_in_window(unsigned short int mem_start_address,unsigned short
 }
 
 /* public functions */
-void mem_init(TMemory *memory)
+void mem_init(TMemory *memory,unsigned char device_id)
 {
   unsigned char i;
 
@@ -30,10 +26,11 @@ void mem_init(TMemory *memory)
     memory->mem_modules[i]=0x00000000;
   memory->eeprom_write_data=0x00000000;
   memory->eeprom_read_data=0x00000000;
+  memory->device_id=device_id;
 
   /* initialize internal variables */
-  memory_total_eeprom=0;
-  memory_total_ram=0;
+  memory->total_eeprom=0;
+  memory->total_ram=0;
 }
 
 void mem_initialize_data(TMemory *memory)
@@ -48,7 +45,7 @@ void mem_initialize_data(TMemory *memory)
   {
     for(i=0;i<EEPROM_SIZE;i++)
     {
-      if(memory->eeprom_read_data(i,&data))
+      if(memory->eeprom_read_data((memory->device_id<<8)+i,&data))
         eeprom_data[i]=0x00;
       else
         eeprom_data[i]=data&0x00FF;
@@ -122,17 +119,17 @@ unsigned char mem_add_module(TMemory *memory, TMemModule *module)
     // check available memory
     for(new_seg=0;new_seg<module->num_ram_segments;new_seg++)
     {
-      memory_total_ram+=module->ram_segments[new_seg].length;
-      if(memory_total_ram>RAM_SIZE)
+      memory->total_ram+=module->ram_segments[new_seg].length;
+      if(memory->total_ram>RAM_SIZE)
         return 0x00;
     }
     for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++)
     {
-      memory_total_eeprom+=module->eeprom_segments[new_seg].length;
-      if(memory_total_eeprom>EEPROM_SIZE)
+      memory->total_eeprom+=module->eeprom_segments[new_seg].length;
+      if(memory->total_eeprom>EEPROM_SIZE)
         return 0x00;
-      memory_total_ram+=module->eeprom_segments[new_seg].length;
-      if(memory_total_ram>RAM_SIZE)
+      memory->total_ram+=module->eeprom_segments[new_seg].length;
+      if(memory->total_ram>RAM_SIZE)
         return 0x00;
     }
 
@@ -195,7 +192,7 @@ void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned shor
           mem_module->write_cmd(mem_module->data,actual_address,actual_length,&data[actual_address-start_address]);
         if(memory->eeprom_write_data!=0x00000000)
           for(k=actual_address;k<(actual_address+actual_length);k++)
-            memory->eeprom_write_data(k,data[k-start_address]);
+            memory->eeprom_write_data((memory->device_id<<8)+k,data[k-start_address]);
       }
     }
   }
diff --git a/memory/src/ram.c b/memory/src/ram.c
index 444c73c..326ab7f 100644
--- a/memory/src/ram.c
+++ b/memory/src/ram.c
@@ -1,7 +1,5 @@
 #include "ram.h"
 
-unsigned char ram_data[RAM_SIZE]={0};
-
 unsigned char ram_init(TMemory *memory)
 {
   mem_initialize_data(memory);
@@ -9,66 +7,66 @@ unsigned char ram_init(TMemory *memory)
   return 0x01;
 }
 
-inline void ram_read_byte(unsigned short int address,unsigned char *data)
+inline void ram_read_byte(TMemory *memory,unsigned short int address,unsigned char *data)
 {
-  (*data)=ram_data[address];
+  (*data)=memory->data[address];
 }
 
-inline void ram_read_word(unsigned short int address, unsigned short int *data)
+inline void ram_read_word(TMemory *memory,unsigned short int address, unsigned short int *data)
 {
-  (*data)=ram_data[address];
-  (*data)+=ram_data[address+1]*256;
+  (*data)=memory->data[address];
+  (*data)+=memory->data[address+1]*256;
 }
 
-unsigned char ram_read_table(unsigned short int address, unsigned short int length,unsigned char *data)
+unsigned char ram_read_table(TMemory *memory,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];
+      data[i]=memory->data[address+i];
     return RAM_SUCCESS;
   }
   else
     return RAM_BAD_ADDRESS;
 }
 
-unsigned char ram_set_bit(unsigned short int address, unsigned char bit)
+unsigned char ram_set_bit(TMemory *memory,unsigned short int address, unsigned char bit)
 {
   if(bit>=0 && bit<8)
   {
-    ram_data[address]|=(0x01<<bit);
+    memory->data[address]|=(0x01<<bit);
     return RAM_SUCCESS;
   }
   else
     return RAM_BAD_BIT;
 }
 
-unsigned char ram_clear_bit(unsigned short int address, unsigned char bit)
+unsigned char ram_clear_bit(TMemory *memory,unsigned short int address, unsigned char bit)
 {
   if(bit>=0 && bit<8)
   {
-    ram_data[address]&=(~(0x01<<bit));
+    memory->data[address]&=(~(0x01<<bit));
     return RAM_SUCCESS;
   }
   else
     return RAM_BAD_BIT;
 }
 
-unsigned char ram_write_byte(unsigned short int address, unsigned char data)
+unsigned char ram_write_byte(TMemory *memory,unsigned short int address, unsigned char data)
 {
-  ram_data[address]=data;
+  memory->data[address]=data;
 
   return RAM_SUCCESS;
 }
 
-unsigned char ram_write_word(unsigned short int address, unsigned short int data)
+unsigned char ram_write_word(TMemory *memory,unsigned short int address, unsigned short int data)
 {
   if(address < (RAM_SIZE-1))
   {
-    ram_data[address]=data%256;
-    ram_data[address+1]=data/256;
+    memory->data[address]=data%256;
+    memory->data[address+1]=data/256;
 
     return RAM_SUCCESS;
   }
@@ -76,14 +74,14 @@ unsigned char ram_write_word(unsigned short int address, unsigned short int data
     return RAM_BAD_ADDRESS;  
 }
 
-unsigned char ram_write_table(unsigned short int address, unsigned short int length,unsigned char *data)
+unsigned char ram_write_table(TMemory *memory,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];
+      memory->data[address+i]=data[i];
     return RAM_SUCCESS;
   }
   else
-- 
GitLab