11 changed files with 87 additions and 48 deletions
@ -0,0 +1,19 @@ |
|||||
|
#include "devices.h" |
||||
|
|
||||
|
rom_device_t::rom_device_t(std::vector<char> data) |
||||
|
: data(data) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
bool rom_device_t::load(reg_t addr, size_t len, uint8_t* bytes) |
||||
|
{ |
||||
|
if (addr + len > data.size()) |
||||
|
return false; |
||||
|
memcpy(bytes, &data[addr], len); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
bool rom_device_t::store(reg_t addr, size_t len, const uint8_t* bytes) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
#include "devices.h" |
||||
|
#include "processor.h" |
||||
|
|
||||
|
rtc_t::rtc_t(std::vector<processor_t*>& procs) |
||||
|
: procs(procs), regs(1 + procs.size()) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
bool rtc_t::load(reg_t addr, size_t len, uint8_t* bytes) |
||||
|
{ |
||||
|
if (addr + len > size()) |
||||
|
return false; |
||||
|
memcpy(bytes, (uint8_t*)®s[0] + addr, len); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
bool rtc_t::store(reg_t addr, size_t len, const uint8_t* bytes) |
||||
|
{ |
||||
|
if (addr + len > size() || addr < 8) |
||||
|
return false; |
||||
|
memcpy((uint8_t*)®s[0] + addr, bytes, len); |
||||
|
increment(0); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
void rtc_t::increment(reg_t inc) |
||||
|
{ |
||||
|
regs[0] += inc; |
||||
|
for (size_t i = 0; i < procs.size(); i++) { |
||||
|
procs[i]->state.mip &= ~MIP_MTIP; |
||||
|
if (regs[0] >= regs[1+i]) |
||||
|
procs[i]->state.mip |= MIP_MTIP; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue