/** * Implementation of a SaM Processor. See the Processor * information for more information. */ public class SamProcessor implements Processor { public final static byte REGISTERS = 5; protected int[] registers = new int[] { 0, 0, Memory.STACKLIMIT, 0, 0 }; protected Program prg; protected Sys sys; public SamProcessor(Sys sys) { this.sys = sys; } /* Loads Program and registers instructions with the System */ public void load(Program prog) { prg = prog; for (int i = 0; i < prog.getLength(); i++) { prog.getInst(i).setSystem(sys); } } public Program getProgram() { return prg; } /* Execution */ public void step() throws SystemException { prg.getInst(registers[PC]).exec(); } public void run() throws SystemException { while (registers[HALT] == 0) step(); } /* Registers */ public void reset() { for (int i = 0; i < REGISTERS; i++) registers[i] = 0; registers[HP] = Memory.STACKLIMIT; } public int get(byte reg) { return registers[reg]; } public int[] getRegisters() { int[] regs = new int[REGISTERS]; System.arraycopy(registers, 0, regs, 0, REGISTERS); return regs; } public void set(byte reg, int value) throws SystemException { verify(reg, value); registers[reg] = value; } public int inc(byte reg) throws SystemException { verify(reg, registers[reg] + 1); return ++registers[reg]; } public int dec(byte reg) throws SystemException { verify(reg, registers[reg] - 1); return --registers[reg]; } private void verify(byte reg, int value) throws SystemException { switch (reg) { case PC : if (value < 0 || value > prg.getLength() - 1) throw new SystemException("Invalid instruction index, PC = " + value); break; case SP : if (value < 0) throw new SystemException("Stack Underflow, SP = " + value); if (value > Memory.STACKLIMIT - 1) throw new SystemException("Stack Overflow, SP = " + value); break; case FBR : if (value < 0 || value > Memory.MEMORYLIMIT - 1) throw new SystemException("Invalid frame address, FBR = " + value); break; default : //User has no control over HALT and HP, handle those where necessary //so that they do not overflow/underflow } } }