Bug fix: check if vm exists
[avr-sim.git] / MMU.cpp
blobb4ceb54dbe30c976e1a0102954553472eff44016
1 #include "MMU.h"
2 #include "Registers.h"
3 #include "SRam.h"
4 #include "AccessViolation.h"
6 namespace avr {
8 MMU::MMU(Register R[], IORegisters & regs,
9 SRam & sram, ERam *eram /*= 0*/) : R(R), regs(regs), sram(sram), eram(eram) {
12 byte MMU::readByte(unsigned int offset) const {
13 if( offset < registerSpaceSize )
14 return R[offset];
16 offset -= registerSpaceSize;
17 if( offset < regs.size() )
18 return regs.readByte(offset);
20 offset -= regs.size();
21 if( offset < sram.size() )
22 return sram.readByte(offset);
24 offset -= sram.size();
25 // if( (eram != 0) && (offset < eram->size()) )
26 // return eram->readByte(offset);
28 throw AccessViolation();
31 word MMU::readWord(unsigned int offset) const {
32 if( offset < regs.size() + registerSpaceSize )
33 throw AccessViolation();
35 offset -= regs.size() + registerSpaceSize;
36 if( offset < sram.size() )
37 return sram.readByte(offset);
39 offset -= sram.size();
40 // if( (eram != 0) && (offset < eram->size()) )
41 // return eram->readByte(offset);
43 throw AccessViolation();
46 void MMU::writeByte(unsigned int offset, byte val) {
47 if( offset < registerSpaceSize )
48 R[offset] = val;
50 offset -= registerSpaceSize;
51 if( offset < regs.size() )
52 return regs.writeByte(offset, val);
54 offset -= regs.size();
55 if( offset < sram.size() )
56 return sram.writeByte(offset, val);
58 offset -= sram.size();
59 // if( (eram != 0) && (offset < eram->size()) )
60 // return eram->writeByte(offset, val);
62 throw AccessViolation();
65 void MMU::writeWord(unsigned int offset, word val) {
66 if( offset < regs.size() + registerSpaceSize )
67 throw AccessViolation();
69 offset -= regs.size() + registerSpaceSize;
70 if( offset < sram.size() )
71 return sram.writeWord(offset, val);
73 offset -= sram.size();
74 // if( (eram != 0) && (offset < eram->size()) )
75 // return eram->writeByte(offset, val);
77 throw AccessViolation();