[Simh] Single stepping.

Bob Supnik bob at supnik.org
Mon Jan 30 08:05:28 EST 2017


If you do want to use different timing, then global variable sim_step is 
available with the current step count (0 means not stepping) at entry to 
sim_instr. sim_step isn't deliberately global; it just works out that 
way. Further, it is NOT maintained as the step count is counted down. 
Therefore, you need to pick it up on the way into sim_instr and count it 
down yourself. You also need to cancel out the sim_step unit, which will 
stop the simulator prematurely. Again, the cancellation routine is 
global, although that wasn't deliberate either.

extern void sim_cancel_step (void);
extern int32 sim_step;
:
t_stat sim_instr (void)
{
uint32 step_limit = (uint32) sim_step, i;
sim_cancel_step ();
:
for (i = 0; ((step_limit == 0) || (i < step_limit)); i++) {
     t_stat r;
     r = cpu_one_instr ();
     if (r != SCPE_OK)
         return r;
     :
     }
return SCPE_STEP;
}

Converting sim_step to uint32 should quiesce compilers that are fussy 
about integer overflow or wraparound on variable i. Or you can use 64b 
integers.

Passing the step count as an argument would require modifying every 
simulator. There are lots of SCP variables that may be of interest to a 
running simulator; they are declared as globals.

The PDP-10 requires timing by memory reference (or something close to 
it), because infinite indirects and XCT * must be interruptible to 
prevent system lockup. The 7094 seems to run fine with timing by 
instruction.

/Bob

On 1/30/2017 5:33 AM, Rich Cornwell wrote:

   I track memory cycles so that I/O is closer to the time that the CPU
   expects. This is more important for the I7000 series since
   instructions where executed during I/O and some of the code relies on
   how many instructions can be executed during a read/write. Also for
   some cases during the I7090 I decrement sim_interval during long
   instructions to closer simulate the real speed of the machine.



More information about the Simh mailing list