LCDScreen:: LCDScreen(RunnableQueue &s, PortConnectionWrapper clk, PortConnectionWrapper data, PortConnectionWrapper de, PortConnectionWrapper hsync, PortConnectionWrapper vsync, unsigned width, unsigned height) : screen(width, height, 0x1f, (0x3f << 5), (0x1f << 11)), scheduler(s), CLKSignal(0), CLKProxy(*this, &LCDScreen::seeCLKChange), x(0), y(0), edgeCounter(0), lastDEHighEdge(0), lastPollForEvents(0) { clk.attach(&CLKProxy); data.attach(&DataTracker); de.attach(&DETracker); hsync.attach(&HSYNCTracker); vsync.attach(&VSYNCTracker); if (!screen.init()) { std::cerr << "Failed to initialize SDL screen\n"; std::exit(1); } schedulePollForEvents(minUpdateTicks); }
UartRx::UartRx(RunnableQueue &s, PortConnectionWrapper p, ticks_t bt) : scheduler(s), currentPinValue(0), bitTime(bt), numDataBits(8), numStopBits(1), parity(NONE), state(WAIT_FOR_HIGH) { p.attach(this); }
static bool connectLoopbackPorts(PortConnectionManager &connectionManager, const LoopbackPorts &ports) { for (const auto &entry : ports) { PortConnectionWrapper first = connectionManager.get(entry.first); if (!first) { std::cerr << "Error: Invalid port "; entry.first.dump(std::cerr); std::cerr << '\n'; return false; } PortConnectionWrapper second = connectionManager.get(entry.second); if (!second) { std::cerr << "Error: Invalid port "; entry.second.dump(std::cerr); std::cerr << '\n'; return false; } first.attach(second.getInterface()); second.attach(first.getInterface()); } return true; }
void connectLDQM(PortConnectionWrapper p) { useLDQM = true; p.attach(&LDQM); }
void connectUDQM(PortConnectionWrapper p) { useUDQM = true; p.attach(&UDQM); }
void connectWE(PortConnectionWrapper p) { p.attach(&WE); }
void connectRAS(PortConnectionWrapper p) { p.attach(&RAS); }
void connectDQ(PortConnectionWrapper p) { p.attach(&DQ); DQPort = p.getInterface(); }
void connectCLK(PortConnectionWrapper p) { p.attach(&CLKClock); }
void connectBA(PortConnectionWrapper p) { p.attach(&BA); }