Merge branch 'development' of
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / mi / StandardMicroInstructionMemory.java
1 package net.mograsim.machine.mi;
2
3 import java.util.HashSet;
4
5 import net.mograsim.machine.MemoryObserver;
6 import net.mograsim.machine.standard.memory.MemoryException;
7
8 public class StandardMicroInstructionMemory implements MicroInstructionMemory
9 {
10         private MicroInstruction[] data;
11         private MicroInstructionMemoryDefinition definition;
12         private HashSet<MemoryObserver> observers = new HashSet<>();
13         
14         public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition)
15         {
16                 if(definition.size() > Integer.MAX_VALUE)
17                         throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long");
18                 this.definition = definition;
19                 data = new MicroInstruction[(int) definition.size()];
20         }
21         
22         private int translate(long address)
23         {
24                 return (int) (address - definition.getMinimalAddress());
25         }
26         
27         @Override
28         public MicroInstruction getCell(long address)
29         {
30                 int translatedAddress = translate(address);
31                 MicroInstruction actual = data[translatedAddress];
32                 if(actual == null)
33                         actual = data[translatedAddress] = definition.getMicroInstructionDefinition().createDefaultInstruction();
34                 return actual;
35         }
36
37         @Override
38         public void setCell(long address, MicroInstruction data)
39         {
40                 this.data[translate(address)] = data;
41         }
42
43         @Override
44         public void registerObserver(MemoryObserver ob)
45         {
46                 observers.add(ob);
47         }
48
49         @Override
50         public void deregisterObserver(MemoryObserver ob)
51         {
52                 observers.remove(ob);
53         }
54
55         @Override
56         public void notifyObservers(long address)
57         {
58                 observers.forEach(ob -> ob.update(address));
59         }
60
61         @Override
62         public MicroInstructionMemoryDefinition getDefinition()
63         {
64                 return definition;
65         }
66
67 }