mirror of
https://github.com/cmosher01/v6502cpp.git
synced 2024-05-31 20:41:32 +00:00
git-svn-id: https://subversion.assembla.com/svn/cmosher/apple2/emu/v6502@10085 884d43a4-ffbe-47e9-90ca-fd8c37d7eb32
This commit is contained in:
parent
3dab7ff2d4
commit
7f3c4c471f
79
v6502.cpp
79
v6502.cpp
|
@ -1,3 +1,4 @@
|
||||||
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -27,11 +28,11 @@ public:
|
||||||
std::map<int,trn> trns;
|
std::map<int,trn> trns;
|
||||||
|
|
||||||
void pHex(unsigned char x) {
|
void pHex(unsigned char x) {
|
||||||
std::cout << std::setw(2) << std::setfill('0') << std::hex << (unsigned long)x;
|
std::cout << std::setw(2) << std::setfill('0') << std::hex << (unsigned long)x << std::dec;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pHexw(unsigned short x) {
|
void pHexw(unsigned short x) {
|
||||||
std::cout << std::setw(4) << std::setfill('0') << std::hex << (unsigned long)x;
|
std::cout << std::setw(4) << std::setfill('0') << std::hex << (unsigned long)x << std::dec;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char readByte(int b7, int b6, int b5, int b4, int b3, int b2, int b1, int b0) {
|
unsigned char readByte(int b7, int b6, int b5, int b4, int b3, int b2, int b1, int b0) {
|
||||||
|
@ -94,6 +95,24 @@ unsigned short rAddr() {
|
||||||
return readWord(AB15,AB14,AB13,AB12,AB11,AB10,AB9,AB8,AB7,AB6,AB5,AB4,AB3,AB2,AB1,AB0);
|
return readWord(AB15,AB14,AB13,AB12,AB11,AB10,AB9,AB8,AB7,AB6,AB5,AB4,AB3,AB2,AB1,AB0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dumpRegs() {
|
||||||
|
std::cout << "A";
|
||||||
|
pHex(rA());
|
||||||
|
std::cout << " X";
|
||||||
|
pHex(rX());
|
||||||
|
std::cout << " Y";
|
||||||
|
pHex(rY());
|
||||||
|
std::cout << " S";
|
||||||
|
pHex(rS());
|
||||||
|
std::cout << " PC";
|
||||||
|
pHexw(rPC());
|
||||||
|
std::cout << " DATA";
|
||||||
|
pHex(rData());
|
||||||
|
std::cout << " ADDR";
|
||||||
|
pHexw(rAddr());
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
void setSeg(int iseg, bool up) {
|
void setSeg(int iseg, bool up) {
|
||||||
seg& s = segs[iseg];
|
seg& s = segs[iseg];
|
||||||
s.pullup = up;
|
s.pullup = up;
|
||||||
|
@ -137,7 +156,10 @@ bool getGroupValue(const std::set<int>& s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void addToGroup(int n, std::set<int>& s) {
|
void addToGroup(int n, std::set<int>& s) {
|
||||||
s.insert(n);
|
std::pair<std::set<int>::iterator,bool> ret = s.insert(n);
|
||||||
|
if (!ret.second) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (n==VCC || n==VSS) {
|
if (n==VCC || n==VSS) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -221,12 +243,27 @@ void recalc(const std::set<int>& s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void recalcAll() {
|
void recalcAll() {
|
||||||
/* TODO */
|
std::set<int> s;
|
||||||
|
for (std::map<int,seg>::iterator i = segs.begin(); i != segs.end(); ++i) {
|
||||||
|
if (!(i->first == VCC || i->first == VSS)) {
|
||||||
|
s.insert(i->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
recalc(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char mRead(unsigned short addr) {
|
unsigned char mRead(unsigned short addr) {
|
||||||
|
std::cout << "read mem: ";
|
||||||
|
pHexw(addr);
|
||||||
|
std::cout << std::endl;
|
||||||
/* TODO get byte from addr in memory */
|
/* TODO get byte from addr in memory */
|
||||||
return 0;
|
unsigned char x;
|
||||||
|
x = 0;
|
||||||
|
switch (addr) {
|
||||||
|
case 0: x = 0xA9; break;
|
||||||
|
case 1: x = 0x5A; break;
|
||||||
|
}
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mWrite(unsigned short addr, unsigned char data) {
|
void mWrite(unsigned short addr, unsigned char data) {
|
||||||
|
@ -234,6 +271,10 @@ void mWrite(unsigned short addr, unsigned char data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void putDataToChip(unsigned char data) {
|
void putDataToChip(unsigned char data) {
|
||||||
|
std::cout << "d2cpu: ";
|
||||||
|
pHex(data);
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
unsigned char x = data;
|
unsigned char x = data;
|
||||||
std::set<int> s;
|
std::set<int> s;
|
||||||
|
|
||||||
|
@ -273,7 +314,7 @@ void writeBus() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void step() {
|
void step() {
|
||||||
if (isHigh(RW)) {
|
if (isHigh(CLK0)) {
|
||||||
setLow(CLK0);
|
setLow(CLK0);
|
||||||
readBus();
|
readBus();
|
||||||
} else {
|
} else {
|
||||||
|
@ -297,13 +338,21 @@ void init() {
|
||||||
setHigh(IRQ);
|
setHigh(IRQ);
|
||||||
std::cout << " NMI" << std::endl;
|
std::cout << " NMI" << std::endl;
|
||||||
setHigh(NMI);
|
setHigh(NMI);
|
||||||
|
|
||||||
|
std::cout << "recalc all" << std::endl;
|
||||||
recalcAll();
|
recalcAll();
|
||||||
|
dumpRegs();
|
||||||
|
|
||||||
|
std::cout << " [8 cycles]" << std::endl;
|
||||||
for (int i(0); i < 8; ++i) {
|
for (int i(0); i < 8; ++i) {
|
||||||
std::cout << " CLK0" << std::endl;
|
std::cout << " CLK0" << std::endl;
|
||||||
setHigh(CLK0);
|
setHigh(CLK0);
|
||||||
|
dumpRegs();
|
||||||
std::cout << " 'CLK0" << std::endl;
|
std::cout << " 'CLK0" << std::endl;
|
||||||
setLow(CLK0);
|
setLow(CLK0);
|
||||||
|
dumpRegs();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << " RESET" << std::endl;
|
std::cout << " RESET" << std::endl;
|
||||||
setHigh(RES);
|
setHigh(RES);
|
||||||
}
|
}
|
||||||
|
@ -374,6 +423,12 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
|
std::cout << "running some..." << std::endl;
|
||||||
|
for (int i(0); i < 5; ++i) {
|
||||||
|
step();
|
||||||
|
dumpRegs();
|
||||||
|
}
|
||||||
|
|
||||||
/*dump chip
|
/*dump chip
|
||||||
for (std::map<int,seg>::iterator i = segs.begin(); i != segs.end(); ++i) {
|
for (std::map<int,seg>::iterator i = segs.begin(); i != segs.end(); ++i) {
|
||||||
const int n = i->first;
|
const int n = i->first;
|
||||||
|
@ -396,17 +451,5 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*dump regs*/
|
|
||||||
std::cout << "regs: " << std::endl;
|
|
||||||
pHex(rA());
|
|
||||||
pHex(rX());
|
|
||||||
pHex(rY());
|
|
||||||
pHex(rS());
|
|
||||||
pHexw(rPC());
|
|
||||||
pHex(rData());
|
|
||||||
pHexw(rAddr());
|
|
||||||
std::cout << std::endl;
|
|
||||||
/**/
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user