package externaldebugger; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import debug.DebugCommand; import debug.DebugCommandType; import debug.DebugResponse; import externaldebugger.CPURemote.ResponseExpectation; import externaldebugger.CPUStatePanel.UpdateWatcher; public class CPUCtlPanel extends JPanel implements UpdateWatcher, ResponseExpectation { private static final long serialVersionUID = 5559878460299891799L; private MemWatcherPanel sp; private MemWatcherPanel pc; private CPUStatePanel state; private long cpuid; private CPURemote remote; public CPUCtlPanel(CPURemote premote, long pcpuid, CPUStatePanel state, MemWatcherPanel pc, MemWatcherPanel sp) { super(new GridLayout(2,2)); this.remote = premote; this.cpuid = pcpuid; this.state = state; this.pc = pc; this.sp = sp; state.watcher = this; remote.setUnexpectedHandler(this); JPanel buttonPan = new JPanel(new GridLayout(0,1)); JButton refresh; buttonPan.add(refresh = new JButton("refresh")); JButton pause; buttonPan.add(pause = new JButton("pause")); JButton resume; buttonPan.add(resume = new JButton("resume")); JButton step; buttonPan.add(step = new JButton("step")); buttonPan.add(new JLabel("")); buttonPan.add(new JLabel("Breakpoint Toggle:")); final JTextField bpfield;buttonPan.add(bpfield = new JTextField()); final JButton bpbutton; buttonPan.add(bpbutton = new JButton("Toggle Break on 0000")); refresh.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { refresh(); } }); pause.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DebugCommand cmd = new DebugCommand(); cmd.type = DebugCommandType.PAUSE; cmd.params = new long[]{cpuid}; remote.commandResponse(cmd); refresh(); } }); resume.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DebugCommand cmd = new DebugCommand(); cmd.type = DebugCommandType.UNPAUSE; cmd.params = new long[]{cpuid}; remote.commandResponse(cmd); } }); step.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DebugCommand cmd = new DebugCommand(); cmd.type = DebugCommandType.STEP; cmd.params = new long[]{cpuid}; remote.commandResponse(cmd); } }); bpfield.getDocument().addDocumentListener(new DocumentListener() { void changed() { String s = bpfield.getText(); try { Integer.parseInt(s, 16); if (s.length()<=4) { bpbutton.setText("(Un)break:"+bpfield.getText()); bpbutton.setEnabled(true); return; } } catch(NumberFormatException e) { } bpbutton.setText("Bad Number"); bpbutton.setEnabled(false); } public void removeUpdate(DocumentEvent arg0) { changed(); } public void insertUpdate(DocumentEvent arg0) { changed(); } public void changedUpdate(DocumentEvent arg0) { changed(); } }); bpbutton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { DebugCommand cmd = new DebugCommand(); cmd.type = DebugCommandType.BREAK; cmd.params = new long[]{cpuid, Integer.parseInt(bpfield.getText(),16)}; remote.commandResponse(cmd); } }); bpfield.setText("0000"); while(buttonPan.getComponents().length<8) { buttonPan.add(new JLabel("")); } add(buttonPan); add(state); add(pc); add(sp); } public void registersUpdated(long[] lvalues) { sp.setBase((int) lvalues[11]-8); sp.setHighlight((int) lvalues[11]); pc.setBase((int) lvalues[10]-8); pc.setHighlight((int) lvalues[10]); sp.update(); pc.update(); } private void refresh() { state.update(); } public void response(DebugResponse r) { state.update(); } public static void main(String[] args) throws UnknownHostException, IOException { } public static void open(String text, int port, int cpu) throws UnknownHostException, IOException { JFrame jf = new JFrame(); CPURemote r = new CPURemote(cpu, new Socket("localhost", port)); CPUStatePanel state = new CPUStatePanel(r, 0); MemWatcherPanel pc = new MemWatcherPanel(r, 0, 0, 16); MemWatcherPanel sp = new MemWatcherPanel(r, 0, 0, 16); final CPUCtlPanel pan = new CPUCtlPanel(r, 0, state, pc, sp); jf.add(pan); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); } }