Machine states now save/restore the CPU's running state

This commit is contained in:
Jeff Parsons 2017-06-27 14:08:16 -07:00 committed by Jeff Parsons
commit 754a4a4027
10 changed files with 977 additions and 949 deletions

View file

@ -897,7 +897,6 @@ class Computer extends Component {
* after they're no longer ready.
*/
if (this.cpu && this.cpu.powerDown) {
if (fShutdown) this.cpu.stopCPU();
data = this.cpu.powerDown(fSave, fShutdown);
if (typeof data === "object") stateComputer.set(this.cpu.id, data);
if (fShutdown) {

View file

@ -183,14 +183,15 @@ class CPU extends Component {
}
/**
* save()
* save(fRunning)
*
* This is a placeholder for save support (overridden by the X86CPU component).
*
* @this {CPU}
* @param {boolean} [fRunning]
* @return {Object|null}
*/
save()
save(fRunning)
{
return null;
}
@ -271,7 +272,9 @@ class CPU extends Component {
*
* this.flags.powered = false;
*/
return fSave? this.save() : true;
var fRunning = this.flags.running;
if (fShutdown) this.stopCPU();
return fSave? this.save(fRunning) : true;
}
/**
@ -748,7 +751,7 @@ class CPU extends Component {
/*
* If we haven't reached 80% (0.8) of the current target speed, revert to a multiplier of one (1).
*/
if (this.aCounts.mhz / this.aCounts.mhzTarget < 0.8) {
if ((fUpdateFocus || this.flags.running) && this.aCounts.mhz / this.aCounts.mhzTarget < 0.8) {
nMultiplier = 1;
} else {
fSuccess = true;

View file

@ -1819,16 +1819,24 @@ class X86CPU extends CPU {
}
/**
* save()
* save(fRunning)
*
* This implements save support for the X86 component.
*
* NOTE: When the Computer starts issuing powerDown() calls, it always calls the CPU first, and the CPU's
* powerDown() handler has the added responsibility of:
*
* 1) recording whether or not the CPU is currently running
* 2) stopping the CPU if the powerDown is part of a shutDown
* 3) passing the original running state to us
*
* UPDATES: The current speed multiplier from getSpeed() is now saved in group #3, so that your speed is preserved.
*
* @this {X86CPU}
* @param {boolean} [fRunning]
* @return {Object|null}
*/
save()
save(fRunning)
{
var state = new State(this);
state.set(0, [this.regEAX, this.regEBX, this.regECX, this.regEDX, this.getSP(), this.regEBP, this.regESI, this.regEDI]);
@ -1839,7 +1847,7 @@ class X86CPU extends CPU {
}
state.set(1, a);
state.set(2, [this.segData.sName, this.segStack.sName, this.opFlags, this.opPrefixes, this.intFlags, this.regEA, this.regEAWrite]);
state.set(3, [0, this.nTotalCycles, this.getSpeed()]);
state.set(3, [0, this.nTotalCycles, this.getSpeed(), fRunning]);
state.set(4, this.bus.saveMemory(this.isPagingEnabled()));
return state.data();
}
@ -1911,7 +1919,10 @@ class X86CPU extends CPU {
a = data[3]; // a[0] was previously nBurstDivisor (no longer used)
this.nTotalCycles = a[1];
this.setSpeed(a[2]); // if we're restoring an old state that doesn't contain a value from getSpeed(), that's OK; setSpeed() checks for an undefined value
this.setSpeed(a[2]); // old states didn't contain a value from getSpeed(), but setSpeed() checks
if (a[3] != null) { // less old states didn't preserve the original running state, so we must check it
this.flags.autoStart = a[3];
}
return fRestored;
}