From ad798a166d5abd342b031251f4a9931b81b2812d Mon Sep 17 00:00:00 2001 From: Martin Perner Date: Thu, 13 Jan 2011 15:05:44 +0100 Subject: [PATCH] sim: added uart extension --- 3b_sim/ccpu.cpp | 7 ++ 3b_sim/ccpu.hpp | 1 + 3b_sim/extensions/cprog.hpp | 3 +- 3b_sim/extensions/cuart.hpp | 123 ++++++++++++++++++++++++++++++++++++ 3b_sim/iext.hpp | 1 + 3b_sim/sim.cpp | 10 ++- 6 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 3b_sim/extensions/cuart.hpp diff --git a/3b_sim/ccpu.cpp b/3b_sim/ccpu.cpp index d2e64e0..3c0049b 100644 --- a/3b_sim/ccpu.cpp +++ b/3b_sim/ccpu.cpp @@ -33,6 +33,13 @@ void CCpu::registerExtension(Iext* ext) m_exts.push_back(ext); } +void CCpu::applyToExtensions(const vector& in) +{ + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + (*iter)->parseInput(in); + } +} + void CCpu::tick() { // signal extensions diff --git a/3b_sim/ccpu.hpp b/3b_sim/ccpu.hpp index a9747c9..fb9447d 100644 --- a/3b_sim/ccpu.hpp +++ b/3b_sim/ccpu.hpp @@ -32,6 +32,7 @@ class CCpu { public: void registerExtension() {}; + void applyToExtensions(const vector& in); void tick(); CDat getRegister(const int) const; diff --git a/3b_sim/extensions/cprog.hpp b/3b_sim/extensions/cprog.hpp index 82d83cf..aa695a5 100644 --- a/3b_sim/extensions/cprog.hpp +++ b/3b_sim/extensions/cprog.hpp @@ -6,6 +6,7 @@ class Cprog : public Iext { void applyTick() {}; void loadData(const int address, CDat value); CDat readData(const int) { return 0; } + void parseInput(const vector&) {}; private: int m_writeAddress; }; @@ -13,7 +14,7 @@ class Cprog : public Iext { void Cprog::loadData(const int address, CDat value) { if(address == 0x2034) { - m_writeAddress = value; + m_writeAddress = (value*4); //adress pointer } else if(address == 0x2038) { diff --git a/3b_sim/extensions/cuart.hpp b/3b_sim/extensions/cuart.hpp new file mode 100644 index 0000000..d1889fc --- /dev/null +++ b/3b_sim/extensions/cuart.hpp @@ -0,0 +1,123 @@ +#include "../iext.hpp" + +class Cuart : public Iext { + public: + Cuart() : m_writeAddress(0), m_fetchCount(0), m_readCount(0), m_recRdy(0), m_txRdy(0), m_recVal(0), m_txVal(0) {}; + void applyTick() {}; + void loadData(const int address, CDat value); + CDat readData(const int); + void parseInput(const vector& in); + private: + int m_writeAddress, m_fetchCount, m_readCount; + bool m_recRdy, m_txRdy; + CDat m_recVal, m_txVal; +}; + + +void Cuart::parseInput(const vector& in) +{ + if(in.size() > 1) { + if((in[1].compare("h") == 0)) { + cout << "UART:" << endl; + cout << "\textension uart r 0xXX \t -- to load the module with a value" << endl; + cout << "\textension uart f \t-- to load a value from the module" << endl; + } + } + if(in.size() < 2) { + return; + } + if(in[1].compare("uart") == 0) { + if(in[2].compare("r") == 0) { + if(in.size() < 3) { + return; + } + if(in[3].substr(0,2) == "0x") { + m_recVal = lexical_cast(in[3]); + } + else { + m_recVal = lexical_cast(in[3]); + } + cout << "UART: loaded 0x" << std::hex << m_recVal << std::dec << endl; + m_recRdy = 1; + m_fetchCount = 0; + m_readCount = 0; + } + else if(in[2].compare("f") == 0) { + cout << "UART: sended 0x" << std::hex << m_txVal << std::dec << endl; + m_txRdy = 0; + m_fetchCount = 0; + m_readCount = 0; + } + else if(in[2].compare("s") == 0) { + cout << "UART:" << endl; + cout << "\ttx busy: " << m_txRdy << endl; + cout << "\trx_newdata: " << m_recRdy << endl; + } + } +} + +CDat Cuart::readData(const int address) +{ + if(address == 0x2000) { + //status - r only +/* cout << "rx: " << m_recRdy << endl; + cout << "tx: " << m_txRdy << endl; + CDat helpme = m_recRdy; + helpme <<= 1; + helpme |= m_txRdy; + cout << "rx<<1 | tx: " << helpme << endl; +*/ + if(m_txRdy == 1) { + m_fetchCount++; + } + if(m_recRdy == 0) { + m_readCount++; + } + + if(m_fetchCount >= 5) { + m_fetchCount = 0; + m_readCount = 0; + m_txRdy = 0; + cout << "UART: force fetched 0x" << std::hex << m_txVal << std::dec << endl; + } + if(m_readCount >= 5) { + m_fetchCount = 0; + m_readCount = 0; + m_recRdy = 1; + cout << "UART: force inserted 0x48 ('H')" << endl; + m_recVal = 'H'; + } + return (m_recRdy<<1)|(m_txRdy); + } + else if(address == 0x2008) { + //trans - w only + //data pointer + } + else if(address == 0x200c) { + //recv - r only + m_recRdy = 0; + m_fetchCount = 0; + m_readCount = 0; + return m_recVal; + } + return 0; +} + +void Cuart::loadData(const int address, CDat value) +{ + + if(address == 0x2000) { + //status - r only + } + else if(address == 0x2008) { + //trans - w only + cout << "UART: byte ready to fetch" << endl; + m_txVal = value; + m_txRdy = 1; + m_fetchCount = 0; + m_readCount = 0; + } + else if(address == 0x200c) { + //recv - r only + } +} diff --git a/3b_sim/iext.hpp b/3b_sim/iext.hpp index 99b0842..c78ad38 100644 --- a/3b_sim/iext.hpp +++ b/3b_sim/iext.hpp @@ -18,6 +18,7 @@ class Iext { virtual ~Iext() {} //called by cpu before every tick virtual void applyTick() = 0; + virtual void parseInput(const vector& in) = 0; virtual void loadData(const int address, CDat value) = 0; virtual CDat readData(const int address) = 0; static CCpu* m_cpu; diff --git a/3b_sim/sim.cpp b/3b_sim/sim.cpp index 0e1a0ae..09808a0 100644 --- a/3b_sim/sim.cpp +++ b/3b_sim/sim.cpp @@ -19,6 +19,7 @@ #include "iext.hpp" #include "extensions/cprog.hpp" +#include "extensions/cuart.hpp" #include "SReadline/SReadline.h" using namespace swift; @@ -455,6 +456,12 @@ void resetPerf(const vector&) global_cpu->setPerf(0); } +void applyToExtensions(const vector& in) +{ + global_cpu->applyToExtensions(in); +} + + void printStatus(const vector&) { CDat stackp = global_cpu->getStack(); @@ -549,6 +556,7 @@ int main(int argc, char* argv[]) Iext::setDisasm(&disasm); global_cpu->registerExtension(new Cprog()); + global_cpu->registerExtension(new Cuart()); vector commentDefer; vector labelDefer; @@ -720,7 +728,7 @@ int main(int argc, char* argv[]) Completers.push_back(CompleterElement("status",&printStatus, "Prints status of CPU.")); Completers.push_back(CompleterElement("getperf",&getPerf, "Prints performance counter.")); Completers.push_back(CompleterElement("resetperf",&resetPerf, "Resets performance counter to 0.")); - + Completers.push_back(CompleterElement("extension",&applyToExtensions, "Write to extensions.")); Reader.RegisterCompletions(Completers); string UserInput; -- 2.25.1