// © Copyright 1997, 1999, Joseph Bergin. All rights reserved.import java.util.Hashtable;import java.util.Enumeration;import cs1.Die;public class Simulator{	public static void main(String argv[])	{	Simulator scpu = new Simulator();	}		public Simulator()	{	init();	}		public void init()	{	_pc = 0;	}		public void step(int n)//Run for n steps or until all processes halt	{	int quittime = _instructionCount + n;		Die roller = new Die(8);		System.out.println("Executing");		while(! _processes.isEmpty() && _instructionCount < quittime)		{	_current = (CPUProcess)_processes.dequeue();			_processCount--;			_pc = _current.getRestart();			_quantum = roller.roll();			int releaseTime = _instructionCount + _quantum;			boolean terminated = false;			while(_instructionCount < releaseTime && ! terminated)			{	_instructionCount++;				// fetch				CPUProcess.Instruction IB = _current.fetch(_pc); 				// increment				_pc++;				// decode				// do				terminated = IB.execute();			}			if( _current.isHalted()) 			{	_haltedProcesses.enqueue(_current);			}			else			{	_current.setRestart(_pc);				_processes.enqueue(_current);				_processCount++;			}		}	}		public void insertProcess(CPUProcess P)  //Enqueue it and give it a memory. 	// Only insert a process after completely defining its program.  Otherwise	// not all of its declarations will be seen. 	{	P.setMemory(_memory);		_processes.enqueue(P);		_processCount++;		P.setRunnable(); 		P.setSimulator(this);	}		public void setPC(int newPC) // Called from the jump instructions.	{	_pc = newPC;	}		public void reset() //Reset all processes and make executable	{	Enumeration e = _processes.elements();		CPUProcess P;		while(e.hasMoreElements())		{	P = (CPUProcess)e.nextElement();			P.reset();			P.setRunnable();		}		while(! _haltedProcesses.isEmpty())		{	P = (CPUProcess)_haltedProcesses.dequeue();			P.reset();			_processes.enqueue(P);			_processCount++;		}		_pc = 0;		// Reset memory also? 	}			public String toString()	{	String result = "Memory: ";			result += _memory.toString();		return result;	}		private Queue  _processes = new Queue(); // Active processes.	private int _processCount = 0; // Number of processes in active queue	private int _instructionCount = 0;	private Queue  _haltedProcesses = new Queue();	private CPUProcess  _current = null; // volatile. Could be a local in step. Here for reporting. 	private int _quantum = 0; // volatile. Quantum of currently executing process	private int _pc = 0; // volatile 	private Hashtable _memory = new Hashtable();}