Merge 'transportdelay' into development
[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                 notifyObservers(address);
42         }
43
44         @Override
45         public void registerObserver(MemoryObserver ob)
46         {
47                 observers.add(ob);
48         }
49
50         @Override
51         public void deregisterObserver(MemoryObserver ob)
52         {
53                 observers.remove(ob);
54         }
55
56         @Override
57         public void notifyObservers(long address)
58         {
59                 observers.forEach(ob -> ob.update(address));
60         }
61
62         @Override
63         public MicroInstructionMemoryDefinition getDefinition()
64         {
65                 return definition;
66         }
67
68 }