/**
 * This class is a Debugger_std specified to be interfaced with the UI DebuggerFrame.
 * <BR>You can read the source of this class <A HREF="./GraphicalDebugger.java.html"> here</A>.
 */
public class GraphicalDebugger extends Debugger_std implements Debugger {

	public GraphicalDebugger(DigitalComponentUI dui) {
		super(dui);
	}

	public void LoadSource(String filename) {
		super.LoadSource(filename);
		Link.ui().UpdateSource(src.SourceString());
	}
// Display methods
	public void DisplayFileRegisters() {
		Link.ui().RefreshFileRegisters(pic.getFileRegisters().Display());
	}

	public void DisplayFlash() {
		String t[] = pic.getFlashForDisplay();
		int i;

		DisassembledFlash = new javax.swing.DefaultListModel();

		for(i = 0 ; i < Flash.FlashSize ; i++)
			DisassembledFlash.addElement(t[i]);

		Link.ui().RefreshProgram(DisassembledFlash);
		Link.ui().SelectProgram(0);
	}

	public void RefreshFlash(int n) {
		DisassembledFlash.setElementAt(pic.getFlashRefresh(n, (String)(DisassembledFlash.getElementAt(n))), n);
	}

	protected javax.swing.DefaultListModel DisassembledFlash;

	public void DisplayState() {
		Link.ui().RefreshCPUState(pic.getStateForDisplay());
	}

	public void DisplayInstruction() {
		Link.ui().SelectProgram(pic.getPC());
	}

	public void DisplayStack() {
		Link.ui().RefreshStack(pic.getStackForDisplay());
	}

	public void DisplayBreakpoints() {
		Link.ui().RefreshBreakpoints(pic.getBreakpointsForDisplay());
	}

	public void LoadProgram(CompiledProgram prog) {
		super.LoadProgram(prog);
		Link.ui().UpdateVariables(prog.getVariablesListForDisplay());
		Link.ui().UpdateLabels(prog.getLabelsListForDisplay());
	}

	public void AssembleAndLoadSource() {
		super.AssembleAndLoadSource();
		Link.ui().UpdateVariables(pic.getFlashMemory().getProgram().getVariablesListForDisplay());
		Link.ui().UpdateLabels(pic.getFlashMemory().getProgram().getLabelsListForDisplay());
	}
// Internal access
	public void ModifyState(int i) {
		String s;

		switch(i) {
			case 0 :	int oldPC = pic.getPC();

					s = Link.ui().Request("PC =", Utils.hex(pic.getPC(), 3, 3));
					if(s == "Canceled") break;

					pic.setPC(Utils.hex2num(s));
					RefreshFlash(oldPC);
					RefreshFlash(pic.getPC());
					DisplayInstruction();
					break;
			case 1 :	s = Link.ui().Request("W  =", Utils.hex(pic.getW(), 2, 2));
					if(s == "Canceled") break;

					pic.setW(Utils.hex2num(s));
					break;
			case 2 :	s = Link.ui().Request("SP =", Utils.hex(pic.getSP(), 1, 1));
					if(s == "Canceled") break;

					pic.setSP(Utils.hex2num(s));
					break;
		}
		DisplayState();
	}

	public void setStack(int i) {
		String s;

		s = Link.ui().Request("Stack[" + i + "] =", Utils.hex(pic.getStack(i), 3, 3));
		if(!(s == "Canceled")) {
			pic.setStack(i, Utils.hex2num(s));
			DisplayAll();
		}
	}

	public void setRAM(int i) {
		String s;

		s = Link.ui().Request("RAM[" + i + "] =", Utils.hex(pic.getFileRegisters().Read(i), 3, 3));
		if(!(s == "Canceled")) {
			pic.getFileRegisters().Write(i, Utils.hex2num(s));
			DisplayAll();
		}
	}
}