package lab02;

public class CPU {
	
	private int accumulator;
	private Memory memory;

	public CPU(Memory memory) {
		accumulator=0; // Not required, but included for clarity
		this.memory=memory;
	}
	
	public void execute(String op,String mode,int argument) {
		// op: LOD, STO, ADD, SUB, MUL, DIV
		// mode: IMM, DIR
		
		//Note... the following holds for all BUT STO
		int input=0;
		if (!op.equals("STO")) {
			if (mode.equals("IMM")) input=argument;
			else if (mode.equals("DIR")) input=memory.get(argument);
			else {
				System.out.println("Error... " + op + " has unrecognized mode: " + mode);
				return;
			}
		}
		
		if (op.equals("LOD")) accumulator=input;
		else if (op.equals("STO")) {
			if (mode.equals("DIR")) {
				memory.set(argument,accumulator);
			} 
			else System.out.println("Error... " + op + " has unrecognized mode: " + mode);
		}
		else if (op.equals("ADD")) accumulator = accumulator + input;
		else if (op.equals("SUB")) accumulator = accumulator - input;
		else if (op.equals("MUL")) accumulator = accumulator * input;
		else if (op.equals("DIV")) {
				if (input==0) 
					System.out.println("Attempt to divide by zero ignored");
				else accumulator = accumulator / input;
		}
		else System.out.println("Error... Unrecognized operator: " + op + " no action performed.");
	}
	
	public int getAccumulator() { return accumulator; }	

}
