mirror of
https://github.com/cmosher01/v6502cpp.git
synced 2024-10-31 16:05:31 +00:00
git-svn-id: https://subversion.assembla.com/svn/cmosher/apple2/emu/v6502@10084 884d43a4-ffbe-47e9-90ca-fd8c37d7eb32
This commit is contained in:
parent
3e91644957
commit
3dab7ff2d4
25
segs
25
segs
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
0 1
|
|
||||||
1 0
|
1 0
|
||||||
2 0
|
2 0
|
||||||
3 1
|
3 1
|
||||||
@ -29,6 +27,7 @@
|
|||||||
27 1
|
27 1
|
||||||
28 0
|
28 0
|
||||||
29 1
|
29 1
|
||||||
|
|
||||||
31 1
|
31 1
|
||||||
32 0
|
32 0
|
||||||
33 1
|
33 1
|
||||||
@ -142,6 +141,7 @@
|
|||||||
141 1
|
141 1
|
||||||
142 1
|
142 1
|
||||||
143 1
|
143 1
|
||||||
|
|
||||||
145 1
|
145 1
|
||||||
146 1
|
146 1
|
||||||
147 0
|
147 0
|
||||||
@ -170,6 +170,7 @@
|
|||||||
170 0
|
170 0
|
||||||
171 0
|
171 0
|
||||||
172 1
|
172 1
|
||||||
|
|
||||||
174 1
|
174 1
|
||||||
175 0
|
175 0
|
||||||
176 1
|
176 1
|
||||||
@ -286,6 +287,7 @@
|
|||||||
287 1
|
287 1
|
||||||
288 1
|
288 1
|
||||||
289 0
|
289 0
|
||||||
|
|
||||||
291 1
|
291 1
|
||||||
292 0
|
292 0
|
||||||
293 1
|
293 1
|
||||||
@ -406,6 +408,7 @@
|
|||||||
408 0
|
408 0
|
||||||
409 1
|
409 1
|
||||||
410 1
|
410 1
|
||||||
|
|
||||||
412 1
|
412 1
|
||||||
413 0
|
413 0
|
||||||
414 0
|
414 0
|
||||||
@ -491,6 +494,7 @@
|
|||||||
494 1
|
494 1
|
||||||
495 0
|
495 0
|
||||||
496 1
|
496 1
|
||||||
|
|
||||||
498 0
|
498 0
|
||||||
499 1
|
499 1
|
||||||
500 1
|
500 1
|
||||||
@ -535,6 +539,7 @@
|
|||||||
539 0
|
539 0
|
||||||
540 1
|
540 1
|
||||||
541 0
|
541 0
|
||||||
|
|
||||||
543 1
|
543 1
|
||||||
544 1
|
544 1
|
||||||
545 0
|
545 0
|
||||||
@ -555,6 +560,7 @@
|
|||||||
560 0
|
560 0
|
||||||
561 0
|
561 0
|
||||||
562 0
|
562 0
|
||||||
|
|
||||||
564 1
|
564 1
|
||||||
565 1
|
565 1
|
||||||
566 1
|
566 1
|
||||||
@ -640,7 +646,7 @@
|
|||||||
646 1
|
646 1
|
||||||
647 1
|
647 1
|
||||||
648 0
|
648 0
|
||||||
649 1
|
0649 1
|
||||||
650 0
|
650 0
|
||||||
651 1
|
651 1
|
||||||
652 1
|
652 1
|
||||||
@ -740,6 +746,7 @@
|
|||||||
746 1
|
746 1
|
||||||
747 1
|
747 1
|
||||||
748 1
|
748 1
|
||||||
|
|
||||||
750 1
|
750 1
|
||||||
751 0
|
751 0
|
||||||
752 0
|
752 0
|
||||||
@ -898,12 +905,14 @@
|
|||||||
905 1
|
905 1
|
||||||
906 1
|
906 1
|
||||||
907 0
|
907 0
|
||||||
|
|
||||||
909 1
|
909 1
|
||||||
910 1
|
910 1
|
||||||
911 0
|
911 0
|
||||||
912 0
|
912 0
|
||||||
913 1
|
913 1
|
||||||
914 0
|
914 0
|
||||||
|
|
||||||
916 1
|
916 1
|
||||||
917 1
|
917 1
|
||||||
918 1
|
918 1
|
||||||
@ -1115,6 +1124,7 @@
|
|||||||
1124 0
|
1124 0
|
||||||
1125 1
|
1125 1
|
||||||
1126 0
|
1126 0
|
||||||
|
|
||||||
1128 0
|
1128 0
|
||||||
1129 1
|
1129 1
|
||||||
1130 1
|
1130 1
|
||||||
@ -1194,6 +1204,8 @@
|
|||||||
1204 1
|
1204 1
|
||||||
1205 1
|
1205 1
|
||||||
1206 1
|
1206 1
|
||||||
|
|
||||||
|
|
||||||
1209 1
|
1209 1
|
||||||
1210 1
|
1210 1
|
||||||
1211 1
|
1211 1
|
||||||
@ -1246,6 +1258,7 @@
|
|||||||
1258 1
|
1258 1
|
||||||
1259 1
|
1259 1
|
||||||
1260 1
|
1260 1
|
||||||
|
|
||||||
1262 1
|
1262 1
|
||||||
1263 0
|
1263 0
|
||||||
1264 0
|
1264 0
|
||||||
@ -1301,6 +1314,7 @@
|
|||||||
1314 1
|
1314 1
|
||||||
1315 1
|
1315 1
|
||||||
1316 1
|
1316 1
|
||||||
|
|
||||||
1318 1
|
1318 1
|
||||||
1319 1
|
1319 1
|
||||||
1320 1
|
1320 1
|
||||||
@ -1344,7 +1358,9 @@
|
|||||||
1358 1
|
1358 1
|
||||||
1359 0
|
1359 0
|
||||||
1360 0
|
1360 0
|
||||||
|
|
||||||
1362 0
|
1362 0
|
||||||
|
|
||||||
1364 1
|
1364 1
|
||||||
1365 0
|
1365 0
|
||||||
1366 0
|
1366 0
|
||||||
@ -1442,6 +1458,7 @@
|
|||||||
1458 1
|
1458 1
|
||||||
1459 1
|
1459 1
|
||||||
1460 1
|
1460 1
|
||||||
|
|
||||||
1462 1
|
1462 1
|
||||||
1463 1
|
1463 1
|
||||||
1464 1
|
1464 1
|
||||||
@ -1643,6 +1660,7 @@
|
|||||||
1660 1
|
1660 1
|
||||||
1661 0
|
1661 0
|
||||||
1662 1
|
1662 1
|
||||||
|
|
||||||
1664 1
|
1664 1
|
||||||
1665 1
|
1665 1
|
||||||
1666 0
|
1666 0
|
||||||
@ -1680,6 +1698,7 @@
|
|||||||
1698 0
|
1698 0
|
||||||
1699 0
|
1699 0
|
||||||
1700 0
|
1700 0
|
||||||
|
|
||||||
1702 0
|
1702 0
|
||||||
1703 0
|
1703 0
|
||||||
1704 1
|
1704 1
|
||||||
|
123
v6502.cpp
123
v6502.cpp
@ -100,12 +100,12 @@ void setSeg(int iseg, bool up) {
|
|||||||
s.pulldown = !up;
|
s.pulldown = !up;
|
||||||
}
|
}
|
||||||
|
|
||||||
void recalc(const std::vector<int>& s);
|
void recalc(const std::set<int>& s);
|
||||||
|
|
||||||
void setSegRC(int iseg, bool up) {
|
void setSegRC(int iseg, bool up) {
|
||||||
setSeg(iseg,up);
|
setSeg(iseg,up);
|
||||||
std::vector<int> s;
|
std::set<int> s;
|
||||||
s.push_back(iseg);
|
s.insert(iseg);
|
||||||
recalc(s);
|
recalc(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,8 +136,88 @@ bool getGroupValue(const std::set<int>& s) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void recalc(const std::vector<int>& s) {
|
void addToGroup(int n, std::set<int>& s) {
|
||||||
/* TODO */
|
s.insert(n);
|
||||||
|
if (n==VCC || n==VSS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
seg& sg = segs[n];
|
||||||
|
for (std::vector<int>::const_iterator itrn = sg.c1c2s.begin(); itrn != sg.c1c2s.end(); ++itrn) {
|
||||||
|
const trn& t = trns[*itrn];
|
||||||
|
if (t.on) {
|
||||||
|
if (t.c1==n) {
|
||||||
|
addToGroup(t.c2,s);
|
||||||
|
} else if (t.c2==n) {
|
||||||
|
addToGroup(t.c1,s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addRecalc(int n, std::set<int>& rcl) {
|
||||||
|
if (n==VCC || n==VSS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rcl.insert(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onTrans(trn& t, std::set<int>& rcl) {
|
||||||
|
if (t.on) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
t.on = true;
|
||||||
|
addRecalc(t.c1,rcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void offTrans(trn& t, std::set<int>& rcl) {
|
||||||
|
if (!t.on) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
t.on = false;
|
||||||
|
addRecalc(t.c1,rcl);
|
||||||
|
addRecalc(t.c2,rcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void recalcNode(int n, std::set<int>& rcl) {
|
||||||
|
if (n==VCC || n==VSS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::set<int> g;
|
||||||
|
addToGroup(n,g);
|
||||||
|
const bool gval = getGroupValue(g);
|
||||||
|
for (std::set<int>::iterator ig = g.begin(); ig != g.end(); ++ig) {
|
||||||
|
seg& seg = segs[*ig];
|
||||||
|
if (seg.state != gval) {
|
||||||
|
seg.state = gval;
|
||||||
|
for (std::vector<int>::iterator igate = seg.gates.begin(); igate != seg.gates.end(); ++igate) {
|
||||||
|
trn& t = trns[*igate];
|
||||||
|
if (seg.state) {
|
||||||
|
onTrans(t,rcl);
|
||||||
|
} else {
|
||||||
|
offTrans(t,rcl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void recalc(const std::set<int>& s) {
|
||||||
|
std::set<int> list(s);
|
||||||
|
for (int sane = 0; sane < 1000; ++sane) {
|
||||||
|
if (!list.size()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::cout << "recalc node count: " << list.size() << std::endl;
|
||||||
|
std::set<int> rcl;
|
||||||
|
for (std::set<int>::iterator ilist = list.begin(); ilist != list.end(); ++ilist) {
|
||||||
|
recalcNode(*ilist,rcl);
|
||||||
|
}
|
||||||
|
list = rcl;
|
||||||
|
if (sane >= 999) {
|
||||||
|
std::cout << "WARNING: hit iteration limit during CPU state recalculation" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void recalcAll() {
|
void recalcAll() {
|
||||||
@ -155,31 +235,31 @@ void mWrite(unsigned short addr, unsigned char data) {
|
|||||||
|
|
||||||
void putDataToChip(unsigned char data) {
|
void putDataToChip(unsigned char data) {
|
||||||
unsigned char x = data;
|
unsigned char x = data;
|
||||||
std::vector<int> s;
|
std::set<int> s;
|
||||||
|
|
||||||
setSeg(DB0,x&1);
|
setSeg(DB0,x&1);
|
||||||
s.push_back(DB0);
|
s.insert(DB0);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB1,x&1);
|
setSeg(DB1,x&1);
|
||||||
s.push_back(DB1);
|
s.insert(DB1);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB2,x&1);
|
setSeg(DB2,x&1);
|
||||||
s.push_back(DB2);
|
s.insert(DB2);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB3,x&1);
|
setSeg(DB3,x&1);
|
||||||
s.push_back(DB3);
|
s.insert(DB3);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB4,x&1);
|
setSeg(DB4,x&1);
|
||||||
s.push_back(DB4);
|
s.insert(DB4);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB5,x&1);
|
setSeg(DB5,x&1);
|
||||||
s.push_back(DB5);
|
s.insert(DB5);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB6,x&1);
|
setSeg(DB6,x&1);
|
||||||
s.push_back(DB6);
|
s.insert(DB6);
|
||||||
x >>= 1;
|
x >>= 1;
|
||||||
setSeg(DB7,x&1);
|
setSeg(DB7,x&1);
|
||||||
s.push_back(DB7);
|
s.insert(DB7);
|
||||||
|
|
||||||
recalc(s);
|
recalc(s);
|
||||||
}
|
}
|
||||||
@ -203,18 +283,28 @@ void step() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
|
std::cout << "initializing CPU..." << std::endl;
|
||||||
segs[VCC].state = true;
|
segs[VCC].state = true;
|
||||||
|
std::cout << " 'RESET" << std::endl;
|
||||||
setLow(RES);
|
setLow(RES);
|
||||||
|
std::cout << " 'CLK0" << std::endl;
|
||||||
setLow(CLK0);
|
setLow(CLK0);
|
||||||
|
std::cout << " RDY" << std::endl;
|
||||||
setHigh(RDY);
|
setHigh(RDY);
|
||||||
|
std::cout << " 'SO" << std::endl;
|
||||||
setLow(SO);
|
setLow(SO);
|
||||||
|
std::cout << " IRQ" << std::endl;
|
||||||
setHigh(IRQ);
|
setHigh(IRQ);
|
||||||
|
std::cout << " NMI" << std::endl;
|
||||||
setHigh(NMI);
|
setHigh(NMI);
|
||||||
recalcAll();
|
recalcAll();
|
||||||
for (int i(0); i < 8; ++i) {
|
for (int i(0); i < 8; ++i) {
|
||||||
|
std::cout << " CLK0" << std::endl;
|
||||||
setHigh(CLK0);
|
setHigh(CLK0);
|
||||||
|
std::cout << " 'CLK0" << std::endl;
|
||||||
setLow(CLK0);
|
setLow(CLK0);
|
||||||
}
|
}
|
||||||
|
std::cout << " RESET" << std::endl;
|
||||||
setHigh(RES);
|
setHigh(RES);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,7 +396,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*dump regs
|
/*dump regs*/
|
||||||
|
std::cout << "regs: " << std::endl;
|
||||||
pHex(rA());
|
pHex(rA());
|
||||||
pHex(rX());
|
pHex(rX());
|
||||||
pHex(rY());
|
pHex(rY());
|
||||||
@ -315,7 +406,7 @@ int main(int argc, char *argv[])
|
|||||||
pHex(rData());
|
pHex(rData());
|
||||||
pHexw(rAddr());
|
pHexw(rAddr());
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
*/
|
/**/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user