clean up the powerOn stuff; add comments
This commit is contained in:
parent
ba9cc7596d
commit
384597e0f9
59
cpu.cpp
59
cpu.cpp
|
@ -139,27 +139,47 @@ void CPU::powerOn() {
|
||||||
dumpRegs();
|
dumpRegs();
|
||||||
dumpSegs();
|
dumpSegs();
|
||||||
|
|
||||||
std::cout << "recalcAll..." << std::endl;
|
|
||||||
recalcAll();
|
|
||||||
dumpRegs();
|
/*
|
||||||
dumpSegs();
|
* Since we use segs[CLK0].on as our own
|
||||||
|
* temporary variable (see "step" method), we
|
||||||
|
* need to initialize it here, to "phase one".
|
||||||
|
*/
|
||||||
|
segs[CLK0].on = true;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::cout << "setting pins..." << std::endl;
|
std::cout << "setting input pins..." << std::endl;
|
||||||
|
// set voltage supply and ground.
|
||||||
setSeg(VCC, true);
|
setSeg(VCC, true);
|
||||||
setSeg(VSS, false);
|
setSeg(VSS, false);
|
||||||
|
// TODO: there are two Vss pins; are they both connected to VSS segment?
|
||||||
|
|
||||||
setSeg(CLK0, true);
|
// don't do the set-overflow overriding functionality
|
||||||
setSeg(IRQ, true);
|
|
||||||
setSeg(RES, false);
|
|
||||||
setSeg(NMI, true);
|
|
||||||
setSeg(RDY, true);
|
|
||||||
setSeg(SO, false);
|
setSeg(SO, false);
|
||||||
|
|
||||||
|
setSeg(IRQ, true);//IRQ_BAR true: not interrupting
|
||||||
|
setSeg(NMI, true);//NMI_BAR true: not interrupting
|
||||||
|
|
||||||
|
setSeg(RDY, true);// ready to run (i.e., do not do single-stepping of instructions)
|
||||||
|
|
||||||
|
|
||||||
std::cout << "recalc all..." << std::endl;
|
/*
|
||||||
|
* RES_BAR pin is "resetting". Since it is a negated pin, pulling it low means "resetting"
|
||||||
|
* and pulling it high means "not resetting" or equivalently "running".
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RES_BAR false: resetting now (i.e., in power-up now; pull high to begin normal operation)
|
||||||
|
* We want to hold RES_BAR low for a while, indicating power-up phase during which the
|
||||||
|
* CPU does not start up normal operations yet. The caller can set RES_BAR high (by calling
|
||||||
|
* reset) whenever he is ready to start the CPU running.
|
||||||
|
*/
|
||||||
|
setSeg(RES, false);
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "initial full calculation..." << std::endl;
|
||||||
recalcAll();
|
recalcAll();
|
||||||
dumpRegs();
|
dumpRegs();
|
||||||
dumpSegs();
|
dumpSegs();
|
||||||
|
@ -176,12 +196,23 @@ void CPU::tick() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU::step() {
|
void CPU::step() {
|
||||||
const bool h = segs[CLK0].on;
|
/*
|
||||||
|
* We cheat a little bit here: instead of requiring the
|
||||||
|
* caller to toggle clock-zero pin, we let him just call
|
||||||
|
* "step" and *we* keep track of which phase we are in.
|
||||||
|
* To do this, we just use the CLK0 segment value (as
|
||||||
|
* a kind of temporary variable), and just toggle it in
|
||||||
|
* order to know which phase we are going into.
|
||||||
|
*
|
||||||
|
* The real 6502, of course, does not do this.
|
||||||
|
*/
|
||||||
|
const bool nextPhase = !segs[CLK0].on;
|
||||||
|
|
||||||
setSeg(CLK0, !h);
|
setSeg(CLK0, nextPhase);
|
||||||
recalc(CLK0);
|
recalc(CLK0);
|
||||||
|
|
||||||
if (!h) {
|
// database read/write happens during Clock Phase 2 (only)
|
||||||
|
if (segs[CLK2OUT].on) {
|
||||||
rw();
|
rw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,14 +59,18 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
|
||||||
/* turn on the CPU */
|
/* turn on the CPU */
|
||||||
|
std::cout << "----------------------------------------" << std::endl;
|
||||||
std::cout << "begin power-up..." << std::endl;
|
std::cout << "begin power-up..." << std::endl;
|
||||||
cpu.powerOn();
|
cpu.powerOn();
|
||||||
|
std::cout << "end power-up..." << std::endl;
|
||||||
|
std::cout << "----------------------------------------" << std::endl;
|
||||||
|
|
||||||
/* run it a bit, before resetting */
|
/* run it a bit, before resetting */
|
||||||
std::cout << "some power-up pre-reset cycles..." << std::endl;
|
std::cout << "some power-up pre-reset cycles..." << std::endl;
|
||||||
for (int i(0); i < 10; ++i) {
|
for (int i(0); i < 10; ++i) {
|
||||||
cpu.tick();
|
cpu.tick();
|
||||||
}
|
}
|
||||||
|
std::cout << "----------------------------------------" << std::endl;
|
||||||
|
|
||||||
/* reset the CPU, and let it run for a little while, then exit */
|
/* reset the CPU, and let it run for a little while, then exit */
|
||||||
std::cout << "RESET..." << std::endl;
|
std::cout << "RESET..." << std::endl;
|
||||||
|
|
Loading…
Reference in New Issue