mirror of
https://github.com/cmosher01/v6502cpp.git
synced 2026-01-23 05:16:05 +00:00
refactor: further split Common and SegmentCache
This commit is contained in:
106
SegmentCache.cpp
106
SegmentCache.cpp
@@ -6,107 +6,39 @@
|
||||
*/
|
||||
|
||||
#include "SegmentCache.h"
|
||||
#include "Common.h"
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
SegmentCache::~SegmentCache() {
|
||||
delete this->c;
|
||||
bool SegmentCache::cached(const std::string& id) const {
|
||||
return this->cache.find(id) != this->cache.end();
|
||||
}
|
||||
|
||||
Segment* SegmentCache::getOrAdd(const std::string& id) {
|
||||
if (this->cache.find(id) == this->cache.end()) {
|
||||
if (!cached(id)) {
|
||||
this->cache[id] = std::make_shared<Segment>(id);
|
||||
|
||||
/*
|
||||
* We want to optimize VSS and VCC checking in
|
||||
* the rest of the program, so we check here
|
||||
* for those two special cases, and flag them.
|
||||
* So, for example, checking (s->vss) is equivalent
|
||||
* to checking (s==VCC).
|
||||
*/
|
||||
if (id == "-vss") {
|
||||
this->cache[id]->vss = true;
|
||||
} else if (id == "+vcc") {
|
||||
this->cache[id]->vcc = true;
|
||||
}
|
||||
}
|
||||
|
||||
return get(id);
|
||||
}
|
||||
|
||||
Segment* SegmentCache::get(const std::string& id) const {
|
||||
if (this->cache.find(id) == this->cache.end()) {
|
||||
if (!cached(id)) {
|
||||
throw "Cannot find segment: " + id;
|
||||
}
|
||||
|
||||
return this->cache.at(id).get();
|
||||
}
|
||||
|
||||
void SegmentCache::initCommon() {
|
||||
this->c = new Common(
|
||||
get("-vss"), get("+vcc"),
|
||||
get("-clk0"),
|
||||
get("-irq"), get("-res"), get("-nmi"),
|
||||
get("+rdy"), get("+so"),
|
||||
get("-db0"), get("-db1"), get("-db2"), get("-db3"), get("-db4"), get("-db5"), get("-db6"), get("-db7"),
|
||||
get("-ab0"), get("-ab1"), get("-ab2"), get("-ab3"), get("-ab4"), get("-ab5"), get("-ab6"), get("-ab7"),
|
||||
get("-ab8"), get("-ab9"), get("-ab10"), get("-ab11"), get("-ab12"), get("-ab13"), get("-ab14"), get("-ab15"),
|
||||
get("-rw"), get("-sync"),
|
||||
get("-clk1out"), get("-clk2out"),
|
||||
get("-a0"), get("-a1"), get("-a2"), get("-a3"), get("-a4"), get("-a5"), get("-a6"), get("-a7"),
|
||||
get("-x0"), get("-x1"), get("-x2"), get("-x3"), get("-x4"), get("-x5"), get("-x6"), get("-x7"),
|
||||
get("-y0"), get("-y1"), get("-y2"), get("-y3"), get("-y4"), get("-y5"), get("-y6"), get("-y7"),
|
||||
get("-pcl0"), get("-pcl1"), get("-pcl2"), get("-pcl3"), get("-pcl4"), get("-pcl5"), get("-pcl6"), get("-pcl7"),
|
||||
get("-pch0"), get("-pch1"), get("-pch2"), get("-pch3"), get("-pch4"), get("-pch5"), get("-pch6"), get("-pch7"),
|
||||
get("+Pout0"), get("+Pout1"), get("+Pout2"), get("+Pout3"), get("+Pout4"), /*no P5 */get("+Pout6"), get("+Pout7"),
|
||||
get("-s0"), get("-s1"), get("-s2"), get("-s3"), get("-s4"), get("-s5"), get("-s6"), get("-s7"));
|
||||
|
||||
this->c->VSS->vss = true;
|
||||
this->c->VCC->vcc = true;
|
||||
}
|
||||
|
||||
unsigned char SegmentCache::rData() const {
|
||||
return Segment::asByte(this->c->DB7, this->c->DB6, this->c->DB5, this->c->DB4, this->c->DB3, this->c->DB2, this->c->DB1, this->c->DB0);
|
||||
}
|
||||
|
||||
unsigned short SegmentCache::rAddr() const {
|
||||
return Segment::asWord(this->c->AB15, this->c->AB14, this->c->AB13, this->c->AB12, this->c->AB11, this->c->AB10, this->c->AB9, this->c->AB8, this->c->AB7, this->c->AB6, this->c->AB5, this->c->AB4, this->c->AB3, this->c->AB2, this->c->AB1, this->c->AB0);
|
||||
}
|
||||
|
||||
unsigned char SegmentCache::rA() const {
|
||||
return Segment::asByte(this->c->A7, this->c->A6, this->c->A5, this->c->A4, this->c->A3, this->c->A2, this->c->A1, this->c->A0);
|
||||
}
|
||||
|
||||
unsigned char SegmentCache::rX() const {
|
||||
return Segment::asByte(this->c->X7, this->c->X6, this->c->X5, this->c->X4, this->c->X3, this->c->X2, this->c->X1, this->c->X0);
|
||||
}
|
||||
|
||||
unsigned char SegmentCache::rY() const {
|
||||
return Segment::asByte(this->c->Y7, this->c->Y6, this->c->Y5, this->c->Y4, this->c->Y3, this->c->Y2, this->c->Y1, this->c->Y0);
|
||||
}
|
||||
|
||||
unsigned char SegmentCache::rS() const {
|
||||
return Segment::asByte(this->c->S7, this->c->S6, this->c->S5, this->c->S4, this->c->S3, this->c->S2, this->c->S1, this->c->S0);
|
||||
}
|
||||
|
||||
unsigned short SegmentCache::rPC() const {
|
||||
return Segment::asWord(this->c->PCH7, this->c->PCH6, this->c->PCH5, this->c->PCH4, this->c->PCH3, this->c->PCH2, this->c->PCH1, this->c->PCH0, this->c->PCL7, this->c->PCL6, this->c->PCL5, this->c->PCL4, this->c->PCL3, this->c->PCL2, this->c->PCL1, this->c->PCL0);
|
||||
}
|
||||
|
||||
void SegmentCache::setDataSegs(const unsigned char data) {
|
||||
unsigned char x = data;
|
||||
|
||||
this->c->DB0->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB1->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB2->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB3->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB4->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB5->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB6->set(x & 1);
|
||||
x >>= 1;
|
||||
this->c->DB7->set(x & 1);
|
||||
}
|
||||
|
||||
void SegmentCache::addDataToRecalc(setpSeg& s) const {
|
||||
s.insert(this->c->DB0);
|
||||
s.insert(this->c->DB1);
|
||||
s.insert(this->c->DB2);
|
||||
s.insert(this->c->DB3);
|
||||
s.insert(this->c->DB4);
|
||||
s.insert(this->c->DB5);
|
||||
s.insert(this->c->DB6);
|
||||
s.insert(this->c->DB7);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user