mirror of
https://github.com/cmosher01/v6502cpp.git
synced 2025-08-09 08:25:06 +00:00
git-svn-id: https://subversion.assembla.com/svn/cmosher/apple2/emu/v6502@10093 884d43a4-ffbe-47e9-90ca-fd8c37d7eb32
This commit is contained in:
2
segsonly
2
segsonly
@@ -1154,7 +1154,7 @@
|
|||||||
1153 1
|
1153 1
|
||||||
1154 1
|
1154 1
|
||||||
1155 1
|
1155 1
|
||||||
1156 1
|
1156 0
|
||||||
1157 1
|
1157 1
|
||||||
1158 0
|
1158 0
|
||||||
1159 1
|
1159 1
|
||||||
|
167
v6502.cpp
167
v6502.cpp
@@ -16,7 +16,7 @@ class seg {
|
|||||||
public:
|
public:
|
||||||
bool pullup;
|
bool pullup;
|
||||||
bool pulldown;
|
bool pulldown;
|
||||||
bool state;
|
bool on;
|
||||||
std::vector<int> gates;
|
std::vector<int> gates;
|
||||||
std::vector<int> c1c2s;
|
std::vector<int> c1c2s;
|
||||||
};
|
};
|
||||||
@@ -31,40 +31,40 @@ public:
|
|||||||
};
|
};
|
||||||
std::vector<trn> trns;
|
std::vector<trn> trns;
|
||||||
|
|
||||||
unsigned char readByte(int b7, int b6, int b5, int b4, int b3, int b2, int b1, int b0) {
|
unsigned char readByte(unsigned int b7, unsigned int b6, unsigned int b5, unsigned int b4, unsigned int b3, unsigned int b2, unsigned int b1, unsigned int b0) {
|
||||||
return
|
return
|
||||||
segs[b7].state<<7 |
|
segs[b7].on<<7 |
|
||||||
segs[b6].state<<6 |
|
segs[b6].on<<6 |
|
||||||
segs[b5].state<<5 |
|
segs[b5].on<<5 |
|
||||||
segs[b4].state<<4 |
|
segs[b4].on<<4 |
|
||||||
segs[b3].state<<3 |
|
segs[b3].on<<3 |
|
||||||
segs[b2].state<<2 |
|
segs[b2].on<<2 |
|
||||||
segs[b1].state<<1 |
|
segs[b1].on<<1 |
|
||||||
segs[b0].state;
|
segs[b0].on;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short readWord(int b15, int b14, int b13, int b12, int b11, int b10, int b9, int b8, int b7, int b6, int b5, int b4, int b3, int b2, int b1, int b0) {
|
unsigned short readWord(unsigned int b15, unsigned int b14, unsigned int b13, unsigned int b12, unsigned int b11, unsigned int b10, unsigned int b9, unsigned int b8, unsigned int b7, unsigned int b6, unsigned int b5, unsigned int b4, unsigned int b3, unsigned int b2, unsigned int b1, unsigned int b0) {
|
||||||
return
|
return
|
||||||
segs[b15].state<<15 |
|
segs[b15].on<<15 |
|
||||||
segs[b14].state<<14 |
|
segs[b14].on<<14 |
|
||||||
segs[b13].state<<13 |
|
segs[b13].on<<13 |
|
||||||
segs[b12].state<<12 |
|
segs[b12].on<<12 |
|
||||||
segs[b11].state<<11 |
|
segs[b11].on<<11 |
|
||||||
segs[b10].state<<10 |
|
segs[b10].on<<10 |
|
||||||
segs[b9].state<<9 |
|
segs[b9].on<<9 |
|
||||||
segs[b8].state<<8 |
|
segs[b8].on<<8 |
|
||||||
segs[b7].state<<7 |
|
segs[b7].on<<7 |
|
||||||
segs[b6].state<<6 |
|
segs[b6].on<<6 |
|
||||||
segs[b5].state<<5 |
|
segs[b5].on<<5 |
|
||||||
segs[b4].state<<4 |
|
segs[b4].on<<4 |
|
||||||
segs[b3].state<<3 |
|
segs[b3].on<<3 |
|
||||||
segs[b2].state<<2 |
|
segs[b2].on<<2 |
|
||||||
segs[b1].state<<1 |
|
segs[b1].on<<1 |
|
||||||
segs[b0].state;
|
segs[b0].on;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isHigh(int iseg) {
|
bool isHigh(int iseg) {
|
||||||
return segs[iseg].state;
|
return segs[iseg].on;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char rData() {
|
unsigned char rData() {
|
||||||
@@ -91,7 +91,7 @@ unsigned char rS() {
|
|||||||
return readByte(S7,S6,S5,S4,S3,S2,S1,S0);
|
return readByte(S7,S6,S5,S4,S3,S2,S1,S0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char rPC() {
|
unsigned short rPC() {
|
||||||
return readWord(PCH7,PCH6,PCH5,PCH4,PCH3,PCH2,PCH1,PCH0,PCL7,PCL6,PCL5,PCL4,PCL3,PCL2,PCL1,PCL0);
|
return readWord(PCH7,PCH6,PCH5,PCH4,PCH3,PCH2,PCH1,PCH0,PCL7,PCL6,PCL5,PCL4,PCL3,PCL2,PCL1,PCL0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ void dumpSegs() {
|
|||||||
} else {
|
} else {
|
||||||
std::cout << "0";
|
std::cout << "0";
|
||||||
}
|
}
|
||||||
if (s.state) {
|
if (s.on) {
|
||||||
std::cout << "+";
|
std::cout << "+";
|
||||||
} else {
|
} else {
|
||||||
std::cout << "-";
|
std::cout << "-";
|
||||||
@@ -130,11 +130,19 @@ void dumpRegs() {
|
|||||||
pHex(rX());
|
pHex(rX());
|
||||||
std::cout << " Y";
|
std::cout << " Y";
|
||||||
pHex(rY());
|
pHex(rY());
|
||||||
|
std::cout << " ";
|
||||||
|
std::cout << (isHigh(P7) ? "N" : "n");
|
||||||
|
std::cout << (isHigh(P6) ? "V" : "v");
|
||||||
|
std::cout << ".";
|
||||||
|
std::cout << (isHigh(P4) ? "B" : "b");
|
||||||
|
std::cout << (isHigh(P3) ? "D" : "d");
|
||||||
|
std::cout << (isHigh(P2) ? "I" : "i");
|
||||||
|
std::cout << (isHigh(P1) ? "Z" : "z");
|
||||||
|
std::cout << (isHigh(P0) ? "C" : "c");
|
||||||
std::cout << " S";
|
std::cout << " S";
|
||||||
pHex(rS());
|
pHex(rS());
|
||||||
std::cout << " PC";
|
std::cout << " PC";
|
||||||
pHexw(rPC());
|
pHexw(rPC());
|
||||||
std::cout << " ";
|
|
||||||
if (isHigh(CLK1OUT)) {
|
if (isHigh(CLK1OUT)) {
|
||||||
std::cout << " PH1 ";
|
std::cout << " PH1 ";
|
||||||
}
|
}
|
||||||
@@ -146,15 +154,6 @@ void dumpRegs() {
|
|||||||
std::cout << " W";
|
std::cout << " W";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (isHigh(CLK2OUT) && !isHigh(RW)) {
|
|
||||||
std::cout << "W";
|
|
||||||
} else if (!isHigh(CLK2OUT) && isHigh(RW)) {
|
|
||||||
std::cout << "R";
|
|
||||||
} else {
|
|
||||||
std::cout << " ";
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
std::cout << " DB";
|
std::cout << " DB";
|
||||||
pHex(rData());
|
pHex(rData());
|
||||||
std::cout << " AB";
|
std::cout << " AB";
|
||||||
@@ -176,7 +175,7 @@ void onTrans(trn& t, std::set<int>& rcl) {
|
|||||||
}
|
}
|
||||||
t.on = true;
|
t.on = true;
|
||||||
addRecalc(t.c1,rcl);
|
addRecalc(t.c1,rcl);
|
||||||
// addRecalc(t.c2,rcl); //???
|
// addRecalc(t.c2,rcl); //looks like this is not necessary?
|
||||||
}
|
}
|
||||||
|
|
||||||
void offTrans(trn& t, std::set<int>& rcl) {
|
void offTrans(trn& t, std::set<int>& rcl) {
|
||||||
@@ -190,16 +189,20 @@ void offTrans(trn& t, std::set<int>& rcl) {
|
|||||||
|
|
||||||
bool getGroupValue(const std::set<int>& s) {
|
bool getGroupValue(const std::set<int>& s) {
|
||||||
if (s.find(VSS) != s.end()) {
|
if (s.find(VSS) != s.end()) {
|
||||||
return false; /* ground always pulls down */
|
return false;
|
||||||
}
|
}
|
||||||
if (s.find(VCC) != s.end()) {
|
if (s.find(VCC) != s.end()) {
|
||||||
return true; /* power always pulls up */
|
return true;
|
||||||
}
|
}
|
||||||
for (std::set<int>::const_iterator i = s.begin(); i != s.end(); ++i) {
|
for (std::set<int>::const_iterator i = s.begin(); i != s.end(); ++i) {
|
||||||
const seg& s = segs[*i];
|
const seg& s = segs[*i];
|
||||||
if (s.pullup) { return true; }
|
if (s.pullup) { return true; }
|
||||||
if (s.pulldown) { return false; }
|
if (s.pulldown) { return false; }
|
||||||
if (s.state) { return true; }
|
// if (s.on) { 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;
|
||||||
}
|
}
|
||||||
@@ -235,12 +238,12 @@ void recalcNode(int n, std::set<int>& rcl) {
|
|||||||
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.state != gval) {
|
if (seg.on != gval) {
|
||||||
//std::cout << "change seg state " << std::endl;
|
//std::cout << "change seg on " << std::endl;
|
||||||
seg.state = 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];
|
trn& t = trns[*igate];
|
||||||
if (seg.state) {
|
if (seg.on) {
|
||||||
onTrans(t,rcl);
|
onTrans(t,rcl);
|
||||||
} else {
|
} else {
|
||||||
offTrans(t,rcl);
|
offTrans(t,rcl);
|
||||||
@@ -310,20 +313,53 @@ void setLow(int iseg) {
|
|||||||
setSeg(iseg,false);
|
setSeg(iseg,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char mRead(unsigned short addr) {
|
unsigned char memory[0x10000];
|
||||||
/* TODO get byte from addr in memory */
|
void init_mem() {
|
||||||
unsigned char x;
|
for (int i = 0; i < 0x10000; ++i) {
|
||||||
x = 0;
|
memory[i] = 0;
|
||||||
switch (addr) {
|
|
||||||
case 0: x = 0xA9; break; // LDA #$5A
|
|
||||||
case 1: x = 0x5A; break; //
|
|
||||||
case 2: x = 0x85; break; // STA $88
|
|
||||||
case 3: x = 0x88; break; //
|
|
||||||
case 4: x = 0xA9; break; // LDA #$23
|
|
||||||
case 5: x = 0x23; break; //
|
|
||||||
case 6: x = 0xD0; break; // BNE 0
|
|
||||||
case 7: x = 0xF8; break; //
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memory[0x0200] = 0xEA; // NOP
|
||||||
|
memory[0x0201] = 0xEA; // NOP
|
||||||
|
memory[0x0202] = 0xA9; // LDA #$5A
|
||||||
|
memory[0x0203] = 0x5A; //
|
||||||
|
memory[0x0204] = 0x85; // STA $88
|
||||||
|
memory[0x0205] = 0x88; //
|
||||||
|
memory[0x0206] = 0xA9; // LDA #$23
|
||||||
|
memory[0x0207] = 0x23; //
|
||||||
|
memory[0x0208] = 0xD0; // BNE 0
|
||||||
|
memory[0x0209] = 0xF8; //
|
||||||
|
|
||||||
|
memory[0xFFFC] = 0x02; // RESET --> $0202
|
||||||
|
memory[0xFFFD] = 0x02;
|
||||||
|
|
||||||
|
// memory[0xFF] = 0x68; // PLA
|
||||||
|
/*
|
||||||
|
memory[0xFF] = 0xFF;
|
||||||
|
memory[0xFFFF] = 0xFE;
|
||||||
|
memory[0xFEFE] = 0xFD;
|
||||||
|
memory[0xFDFD] = 0xFC;
|
||||||
|
memory[0xFCFC] = 0xFB;
|
||||||
|
memory[0xFBFB] = 0xFA;
|
||||||
|
memory[0xFAFA] = 0xF9;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
void pZP() {
|
||||||
|
int a = 0;
|
||||||
|
for (int i = 0; i < 16; ++i) {
|
||||||
|
pHexw(a);
|
||||||
|
std::cout << ": ";
|
||||||
|
for (int j = 0; j < 16; ++j) {
|
||||||
|
pHex(memory[a++]);
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char mRead(unsigned short addr) {
|
||||||
|
unsigned char x;
|
||||||
|
x = memory[addr];
|
||||||
#ifdef TRACEMEM
|
#ifdef TRACEMEM
|
||||||
std::cout << "--------------------------------------------- ";
|
std::cout << "--------------------------------------------- ";
|
||||||
pHex(x);
|
pHex(x);
|
||||||
@@ -336,6 +372,7 @@ unsigned char mRead(unsigned short addr) {
|
|||||||
|
|
||||||
void mWrite(unsigned short addr, unsigned char data) {
|
void mWrite(unsigned short addr, unsigned char data) {
|
||||||
/* TODO write data to addr in memory */
|
/* TODO write data to addr in memory */
|
||||||
|
memory[addr] = data;
|
||||||
#ifdef TRACEMEM
|
#ifdef TRACEMEM
|
||||||
std::cout << "--------------------------------------------- ";
|
std::cout << "--------------------------------------------- ";
|
||||||
pHex(data);
|
pHex(data);
|
||||||
@@ -421,6 +458,7 @@ void step() {
|
|||||||
|
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
|
init_mem();
|
||||||
std::cout << "initializing CPU..." << std::endl;
|
std::cout << "initializing CPU..." << std::endl;
|
||||||
//dumpRegs();
|
//dumpRegs();
|
||||||
//dumpSegs();
|
//dumpSegs();
|
||||||
@@ -451,9 +489,10 @@ recalc(s);
|
|||||||
//dumpSegs();
|
//dumpSegs();
|
||||||
// std::cout << "recalc all" << std::endl;
|
// std::cout << "recalc all" << std::endl;
|
||||||
// recalcAll();
|
// recalcAll();
|
||||||
|
rw();
|
||||||
dumpRegs();
|
dumpRegs();
|
||||||
std::cout << " [50 cycles]" << std::endl;
|
std::cout << "some power-up pre-reset cycles" << std::endl;
|
||||||
for (int i(0); i < 50; ++i) {
|
for (int i(0); i < 10; ++i) {
|
||||||
step();
|
step();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -489,7 +528,7 @@ int main(int argc, char *argv[])
|
|||||||
seg s;
|
seg s;
|
||||||
s.pullup = b_on;
|
s.pullup = b_on;
|
||||||
s.pulldown = false;
|
s.pulldown = false;
|
||||||
s.state = false;
|
s.on = false;
|
||||||
segs.push_back(s);
|
segs.push_back(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user