Bug fix: check if vm exists
[avr-sim.git] / Registers.cpp
blobf0e375a00b7f80a8ff318a9e4ce58c99b7df149b
1 #include "Registers.h"
2 #include "Util.h"
3 #include "Trace.h"
4 #include "Hardware.h"
5 #include <algorithm>
7 #include "Format.h"
8 #include "RuntimeException.h"
10 namespace avr {
12 IORegisters::IORegisters(unsigned int count) {
13 regs.resize( count );
14 setEach( regs.begin(), regs.end(), (IORegister *)0 );
17 IORegisters::~IORegisters() {
18 std::for_each( regs.begin(), regs.end(), Delete<IORegister>() );
21 void IORegisters::addReg( word addr, IORegister *reg ) {
22 regs[ addr ] = reg;
25 IORegister *IORegisters::getIoreg(const std::string & name, bool required) const {
26 std::vector<IORegister *>::const_iterator it;
27 for(it = regs.begin(); it != regs.end(); ++it) {
28 if( ((*it) != 0) && (*it)->getName() == name )
29 break;
32 if( it == regs.end() ) {
33 if( ! required )
34 return 0;
36 throw util::RuntimeException(
37 util::format("Unable to find register %s") % name );
40 return (*it);
43 void IORegisters::reset() {
44 std::for_each( regs.begin(), regs.end(),
45 MethodCall<IORegister>(&IORegister::reset) );
48 unsigned char Register::operator =(unsigned char val) {
49 unsigned char ret = this->val;
50 this->val = val;
51 Trace::instance().register_write(address, val);
52 return ret;
55 Register::operator unsigned char() const {
56 Trace::instance().register_read(address, val);
57 return val;
60 unsigned char IORegister::operator =(unsigned char val) {
61 unsigned char ret = Register::operator =(val);
62 if( hw != 0 )
63 hw->regChanged( this );
64 return ret;
67 void IORegister::operator |=(unsigned char val) {
68 this->val |= val;
69 if( hw != 0 )
70 hw->regChanged( this );
73 void IORegister::operator &=(unsigned char val) {
74 this->val &= val;
75 if( hw != 0 )
76 hw->regChanged( this );