mirror of
https://github.com/cmosher01/v6502cpp.git
synced 2024-10-31 16:05:31 +00:00
some refactoring and cleanup
This commit is contained in:
parent
ba6ae1751e
commit
2aab7240d2
170
cpu.cpp
170
cpu.cpp
@ -14,8 +14,21 @@
|
|||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "addressbus.h"
|
#include "addressbus.h"
|
||||||
|
|
||||||
#define TRACE 1
|
#define TRACEREG 1
|
||||||
#define TRACEMEM 1
|
//#define TRACESEG 1
|
||||||
|
//#define TRACEMEM 1
|
||||||
|
|
||||||
|
#ifdef TRACEREG
|
||||||
|
#define dumpRegs() dumpRegisters()
|
||||||
|
#else
|
||||||
|
#define dumpRegs()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TRACESEG
|
||||||
|
#define dumpSegs() dumpSegments()
|
||||||
|
#else
|
||||||
|
#define dumpSegs()
|
||||||
|
#endif
|
||||||
|
|
||||||
CPU::CPU(AddressBus& addressBus) :
|
CPU::CPU(AddressBus& addressBus) :
|
||||||
addressBus(addressBus) {
|
addressBus(addressBus) {
|
||||||
@ -171,31 +184,32 @@ static void pHexw(unsigned short x) {
|
|||||||
std::cout << std::setw(4) << std::setfill('0') << std::hex << (unsigned long) x << std::dec;
|
std::cout << std::setw(4) << std::setfill('0') << std::hex << (unsigned long) x << std::dec;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::dumpSegs() {
|
void CPU::dumpSegments() {
|
||||||
for (int i = 0; i < segs.size(); ++i) {
|
for (int i = 0; i < segs.size(); ++i) {
|
||||||
std::cout << i << " ";
|
// std::cout << i << " ";
|
||||||
seg& s = segs[i];
|
seg& s = segs[i];
|
||||||
if (s.pullup) {
|
if (s.pullup) {
|
||||||
std::cout << "+";
|
std::cout << "U";
|
||||||
} else if (s.pulldown) {
|
} else if (s.pulldown) {
|
||||||
std::cout << "-";
|
std::cout << "D";
|
||||||
} else {
|
} else {
|
||||||
std::cout << "0";
|
std::cout << "f";
|
||||||
}
|
}
|
||||||
if (s.on) {
|
if (s.on) {
|
||||||
std::cout << "+";
|
std::cout << "+";
|
||||||
} else {
|
} else {
|
||||||
std::cout << "-";
|
std::cout << "-";
|
||||||
}
|
}
|
||||||
std::cout << std::endl;
|
// std::cout << std::endl;
|
||||||
}
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char CPU::mRead(unsigned short addr) {
|
unsigned char CPU::mRead(unsigned short addr) {
|
||||||
unsigned char x;
|
unsigned char x;
|
||||||
x = this->addressBus.read(addr);
|
x = this->addressBus.read(addr);
|
||||||
#ifdef TRACEMEM
|
#ifdef TRACEMEM
|
||||||
std::cout << "--------------------------------------------- ";
|
std::cout << "-------------------------------------------------- ";
|
||||||
pHex(x);
|
pHex(x);
|
||||||
std::cout << "<";
|
std::cout << "<";
|
||||||
pHexw(addr);
|
pHexw(addr);
|
||||||
@ -207,7 +221,7 @@ unsigned char CPU::mRead(unsigned short addr) {
|
|||||||
void CPU::mWrite(unsigned short addr, unsigned char data) {
|
void CPU::mWrite(unsigned short addr, unsigned char data) {
|
||||||
this->addressBus.write(addr, data);
|
this->addressBus.write(addr, data);
|
||||||
#ifdef TRACEMEM
|
#ifdef TRACEMEM
|
||||||
std::cout << "--------------------------------------------- ";
|
std::cout << "-------------------------------------------------- ";
|
||||||
pHex(data);
|
pHex(data);
|
||||||
std::cout << ">";
|
std::cout << ">";
|
||||||
pHexw(addr);
|
pHexw(addr);
|
||||||
@ -215,7 +229,7 @@ void CPU::mWrite(unsigned short addr, unsigned char data) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::dumpRegs() {
|
void CPU::dumpRegisters() {
|
||||||
std::cout << "A";
|
std::cout << "A";
|
||||||
pHex(rA());
|
pHex(rA());
|
||||||
std::cout << " X";
|
std::cout << " X";
|
||||||
@ -246,6 +260,9 @@ void CPU::dumpRegs() {
|
|||||||
std::cout << " W";
|
std::cout << " W";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (! (isHigh(CLK1OUT) || isHigh(CLK2OUT))) {
|
||||||
|
std::cout << " PH- ";
|
||||||
|
}
|
||||||
std::cout << " DB";
|
std::cout << " DB";
|
||||||
pHex(rData());
|
pHex(rData());
|
||||||
std::cout << " AB";
|
std::cout << " AB";
|
||||||
@ -261,23 +278,13 @@ static void addRecalc(int n, std::set<int>& rcl) {
|
|||||||
rcl.insert(n);
|
rcl.insert(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void onTrans(trn& t, std::set<int>& rcl) {
|
static void setTrans(trn& t, bool on, std::set<int>& rcl) {
|
||||||
if (t.on) {
|
if (t.on != on) {
|
||||||
return;
|
t.on = on;
|
||||||
}
|
|
||||||
t.on = true;
|
|
||||||
addRecalc(t.c1, rcl);
|
|
||||||
addRecalc(t.c2, rcl); //looks like this is not necessary?
|
|
||||||
}
|
|
||||||
|
|
||||||
static void offTrans(trn& t, std::set<int>& rcl) {
|
|
||||||
if (!t.on) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
t.on = false;
|
|
||||||
addRecalc(t.c1, rcl);
|
addRecalc(t.c1, rcl);
|
||||||
addRecalc(t.c2, rcl);
|
addRecalc(t.c2, rcl);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool CPU::getGroupValue(const std::set<int>& s) {
|
bool CPU::getGroupValue(const std::set<int>& s) {
|
||||||
if (s.find(VSS) != s.end()) {
|
if (s.find(VSS) != s.end()) {
|
||||||
@ -298,12 +305,6 @@ bool CPU::getGroupValue(const std::set<int>& s) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (std::set<int>::const_iterator i = s.begin(); i != s.end(); ++i) {
|
|
||||||
const seg& s = segs[*i];
|
|
||||||
if (s.on) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,19 +336,14 @@ void CPU::recalcNode(int n, std::set<int>& rcl) {
|
|||||||
addToGroup(n, g);
|
addToGroup(n, g);
|
||||||
const bool gval = getGroupValue(g);
|
const bool gval = getGroupValue(g);
|
||||||
//std::cout << "gval: " << gval << " grp size: " << g.size() << std::endl;
|
//std::cout << "gval: " << gval << " grp size: " << g.size() << std::endl;
|
||||||
|
|
||||||
for (std::set<int>::iterator ig = g.begin(); ig != g.end(); ++ig) {
|
for (std::set<int>::iterator ig = g.begin(); ig != g.end(); ++ig) {
|
||||||
//std::cout << "ig: " << *ig << std::endl;
|
//std::cout << "ig: " << *ig << std::endl;
|
||||||
seg& seg = segs[*ig];
|
seg& seg = segs[*ig];
|
||||||
if (seg.on != gval) {
|
if (seg.on != gval) {
|
||||||
//std::cout << "change seg on " << std::endl;
|
|
||||||
seg.on = gval;
|
seg.on = gval;
|
||||||
for (std::vector<int>::iterator igate = seg.gates.begin(); igate != seg.gates.end(); ++igate) {
|
for (std::vector<int>::iterator igate = seg.gates.begin(); igate != seg.gates.end(); ++igate) {
|
||||||
trn& t = trns[*igate];
|
setTrans(trns[*igate], seg.on, rcl);
|
||||||
if (seg.on) {
|
|
||||||
onTrans(t, rcl);
|
|
||||||
} else {
|
|
||||||
offTrans(t, rcl);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -365,7 +361,6 @@ void CPU::recalc(const std::set<int>& s) {
|
|||||||
std::set<int> rcl;
|
std::set<int> rcl;
|
||||||
for (std::set<int>::const_iterator ilist = list.begin(); ilist != list.end(); ++ilist) {
|
for (std::set<int>::const_iterator ilist = list.begin(); ilist != list.end(); ++ilist) {
|
||||||
recalcNode(*ilist, rcl);
|
recalcNode(*ilist, rcl);
|
||||||
//std::cout << "done recalcNode" << std::endl;
|
|
||||||
}
|
}
|
||||||
// done.insert(rcl.begin(),rcl.end());
|
// done.insert(rcl.begin(),rcl.end());
|
||||||
// std::set<int> v;
|
// std::set<int> v;
|
||||||
@ -402,20 +397,7 @@ void CPU::setSeg(int iseg, bool up) {
|
|||||||
s.pulldown = !up;
|
s.pulldown = !up;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::setHigh(int iseg) {
|
void CPU::putDataToChip(const unsigned char data) {
|
||||||
setSeg(iseg, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPU::setLow(int iseg) {
|
|
||||||
setSeg(iseg, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPU::putDataToChip(unsigned char data) {
|
|
||||||
/*
|
|
||||||
std::cout << "d2cpu: ";
|
|
||||||
pHex(data);
|
|
||||||
std::cout << std::endl;
|
|
||||||
*/
|
|
||||||
unsigned char x = data;
|
unsigned char x = data;
|
||||||
|
|
||||||
setSeg(DB0, x & 1);
|
setSeg(DB0, x & 1);
|
||||||
@ -460,76 +442,60 @@ static void addDataToRecalc(std::set<int>& s) {
|
|||||||
|
|
||||||
void CPU::rw() {
|
void CPU::rw() {
|
||||||
readBus();
|
readBus();
|
||||||
|
|
||||||
std::set<int> s;
|
std::set<int> s;
|
||||||
addDataToRecalc(s);
|
addDataToRecalc(s);
|
||||||
recalc(s);
|
recalc(s);
|
||||||
|
|
||||||
writeBus();
|
writeBus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::step() {
|
void CPU::step() {
|
||||||
if (isHigh(CLK0)) {
|
const bool h = isHigh(CLK0);
|
||||||
setLow(CLK0);
|
|
||||||
recalc(CLK0);
|
setSeg(CLK0, !h);
|
||||||
} else {
|
|
||||||
setHigh(CLK0);
|
|
||||||
recalc(CLK0);
|
recalc(CLK0);
|
||||||
|
|
||||||
|
if (!h) {
|
||||||
rw();
|
rw();
|
||||||
}
|
}
|
||||||
#ifdef TRACE
|
|
||||||
dumpRegs();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
dumpRegs();
|
||||||
|
dumpSegs();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::powerOn() {
|
void CPU::powerOn() {
|
||||||
std::cout << "initializing CPU..." << std::endl;
|
std::cout << "initial state" << std::endl;
|
||||||
//dumpRegs();
|
|
||||||
//dumpSegs();
|
|
||||||
recalcAll();
|
|
||||||
//dumpSegs();
|
|
||||||
#ifdef TRACE
|
|
||||||
dumpRegs();
|
dumpRegs();
|
||||||
#endif
|
dumpSegs();
|
||||||
setHigh(VCC);
|
|
||||||
setLow(VSS);
|
|
||||||
|
|
||||||
setHigh(CLK0);
|
std::cout << "recalcAll..." << std::endl;
|
||||||
setHigh(IRQ);
|
|
||||||
setLow(RES);
|
|
||||||
setHigh(NMI);
|
|
||||||
setHigh(RDY);
|
|
||||||
setLow(SO);
|
|
||||||
|
|
||||||
std::set<int> s;
|
|
||||||
s.insert(VCC);
|
|
||||||
s.insert(VSS);
|
|
||||||
s.insert(CLK0);
|
|
||||||
s.insert(IRQ);
|
|
||||||
s.insert(RES);
|
|
||||||
s.insert(NMI);
|
|
||||||
s.insert(RDY);
|
|
||||||
s.insert(SO);
|
|
||||||
recalc(s);
|
|
||||||
//dumpSegs();
|
|
||||||
std::cout << "recalc all" << std::endl;
|
|
||||||
recalcAll();
|
recalcAll();
|
||||||
rw();
|
|
||||||
#ifdef TRACE
|
|
||||||
dumpRegs();
|
dumpRegs();
|
||||||
#endif
|
dumpSegs();
|
||||||
std::cout << "some power-up pre-reset cycles" << std::endl;
|
|
||||||
for (int i(0); i < 40; ++i) {
|
|
||||||
step();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << " RESET" << std::endl;
|
|
||||||
reset();
|
|
||||||
for (int i(0); i < 40; ++i) {
|
std::cout << "setting pins..." << std::endl;
|
||||||
step();
|
setSeg(VCC, true);
|
||||||
}
|
setSeg(VSS, false);
|
||||||
|
|
||||||
|
setSeg(CLK0, true);
|
||||||
|
setSeg(IRQ, true);
|
||||||
|
setSeg(RES, false);
|
||||||
|
setSeg(NMI, true);
|
||||||
|
setSeg(RDY, true);
|
||||||
|
setSeg(SO, false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "recalc all..." << std::endl;
|
||||||
|
recalcAll();
|
||||||
|
dumpRegs();
|
||||||
|
dumpSegs();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::reset() {
|
void CPU::reset() {
|
||||||
setHigh(RES);
|
setSeg(RES, true);
|
||||||
recalc(RES);
|
recalc(RES);
|
||||||
}
|
}
|
||||||
|
4
cpu.h
4
cpu.h
@ -39,8 +39,8 @@ private:
|
|||||||
unsigned char rY();
|
unsigned char rY();
|
||||||
unsigned char rS();
|
unsigned char rS();
|
||||||
unsigned short rPC();
|
unsigned short rPC();
|
||||||
void dumpSegs();
|
void dumpSegments();
|
||||||
void dumpRegs();
|
void dumpRegisters();
|
||||||
bool getGroupValue(const std::set<int>& s);
|
bool getGroupValue(const std::set<int>& s);
|
||||||
void addToGroup(int n, std::set<int>& s);
|
void addToGroup(int n, std::set<int>& s);
|
||||||
void recalcNode(int n, std::set<int>& rcl);
|
void recalcNode(int n, std::set<int>& rcl);
|
||||||
|
14
v6502.cpp
14
v6502.cpp
@ -53,7 +53,21 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
CPU cpu(mem);
|
CPU cpu(mem);
|
||||||
|
|
||||||
|
|
||||||
|
/* Now let's just run some things to play with it. */
|
||||||
|
std::cout << "begin power-up..." << std::endl;
|
||||||
cpu.powerOn();
|
cpu.powerOn();
|
||||||
|
|
||||||
|
std::cout << "some power-up pre-reset cycles..." << std::endl;
|
||||||
|
for (int i(0); i < 10; ++i) {
|
||||||
|
cpu.tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "RESET..." << std::endl;
|
||||||
|
cpu.reset();
|
||||||
|
for (int i(0); i < 40; ++i) {
|
||||||
|
cpu.tick();
|
||||||
|
}
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user