7972aa8f061344cf4a5f6c4cd5d4b9dd895c71ae
[calu.git] / 3b_sim / cpmem.cpp
1
2 //i'm sorry
3 //pervert forwarding
4 //didn't know (or was to lazy) to find another fix
5 #define __CPU__H__
6 class CCpu;
7
8 #include "cpmem.hpp"
9
10 using namespace std;
11
12 template <typename T>
13 void CPMem<T>::set(const MEMORY_ADDRESS address, const T data)
14 {
15         if(address >= MAX_MEMORY) {
16                 stringstream error;
17                 error << "memoryaddress " << address << " out of range";
18                 throw out_of_range(error.str());
19         }
20
21         MEMORY_ADDRESS temp = (address & (~(BYTE_COUNT-1))) / BYTE_COUNT;
22         auto iter = m_memory.begin();
23         while(temp > 0) {
24                 ++iter;
25                 temp--;
26         }
27
28         iter = m_memory.insert(iter, data);
29         ++iter;
30         m_memory.erase(iter);
31 }
32
33 template <typename T>
34 T CPMem<T>::get(const MEMORY_ADDRESS address) const
35 {
36         if(address >= MAX_MEMORY) {
37                 stringstream error;
38                 error << "memoryaddress " << address << " out of range";
39                 throw out_of_range(error.str());
40         }
41         MEMORY_ADDRESS temp = (address & (~(BYTE_COUNT-1))) / BYTE_COUNT;
42         return m_memory[temp];
43 }
44
45 template <typename T>
46 CPMem<T>::~CPMem()
47 {
48         for(auto iter = m_memory.begin(); iter != m_memory.end(); ++iter) {
49                 delete (*iter);
50         }
51 }
52
53
54 template class CPMem<Iinstr*>;