Example #1
0
 public override void Execute(ICpu cpu)
 {
     // Wait model is: Because waits can occur in triggers as well as in
     // mainline code, the CPU can't be the one to be tracking the
     // remaining time on the wait.  There can be more than one place where
     // a wait was pending.  So instead track the pending time inside the
     // opcode itself, by having the opcode store its timestamp when it is
     // meant to end, and checking it each time.
     if (endTime < 0) // initial time being executed.
     {
         double arg = Convert.ToDouble(cpu.PopValue());
         endTime = cpu.StartWait(arg);
         DeltaInstructionPointer = 0; // stay here next time.
     }
     else if (cpu.SessionTime < endTime) // It's in the midst of an already running wait, and it's not expired yet.
     {
         cpu.StartWait(0); // kick back to wait mode again.
         DeltaInstructionPointer = 0; // stay here next time, to test this again.
     }
     else // It was in an already running wait, and the wait just expired.
     {
         endTime = -1; // reset in case this is called again in a loop.
         DeltaInstructionPointer = 1; // okay now move on.
     }
 }
Example #2
0
 public override void Execute(ICpu cpu)
 {
     object arg = cpu.PopValue();
     cpu.StartWait(Convert.ToDouble(arg));
 }