mirror of https://github.com/contiki-ng/mspsim
216 lines
6.3 KiB
Java
216 lines
6.3 KiB
Java
/**
|
|
* Copyright (c) 2007, Swedish Institute of Computer Science.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the Institute nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* This file is part of MSPSim.
|
|
*
|
|
* $Id: DebugUI.java,v 1.3 2007/10/21 21:17:34 nfi Exp $
|
|
*
|
|
* -----------------------------------------------------------------
|
|
*
|
|
* DebugUI
|
|
*
|
|
* Author : Joakim Eriksson
|
|
* Created : Sun Oct 21 22:00:00 2007
|
|
* Updated : $Date: 2007/10/21 21:17:34 $
|
|
* $Revision: 1.3 $
|
|
*/
|
|
|
|
package se.sics.mspsim.ui;
|
|
import java.awt.BorderLayout;
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Font;
|
|
import java.awt.GridLayout;
|
|
import javax.swing.AbstractListModel;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JList;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.ListCellRenderer;
|
|
|
|
import se.sics.mspsim.core.*;
|
|
import se.sics.mspsim.util.Utils;
|
|
|
|
public class DebugUI extends JPanel {
|
|
|
|
private JList disList;
|
|
private JLabel[] regsLabel;
|
|
private MSP430 cpu;
|
|
private DbgListModel listModel;
|
|
private int currentAddress = 0;
|
|
|
|
private DisAsm disAsm;
|
|
|
|
/**
|
|
* Creates a new <code>DebugUI</code> instance.
|
|
*
|
|
*/
|
|
public DebugUI(MSP430 cpu) {
|
|
this(cpu, true);
|
|
}
|
|
|
|
public DebugUI(MSP430 cpu, boolean showRegs) {
|
|
super(new BorderLayout());
|
|
this.cpu = cpu;
|
|
disAsm = cpu.getDisAsm();
|
|
|
|
disList = new JList(listModel = new DbgListModel());
|
|
disList.setFont(new Font("courier", 0, 12));
|
|
disList.setCellRenderer(new MyCellRenderer());
|
|
add(disList, BorderLayout.CENTER);
|
|
|
|
if (showRegs) {
|
|
JPanel regs = new JPanel(new GridLayout(2,8,4,0));
|
|
regsLabel = new JLabel[16];
|
|
for (int i = 0, n = 16; i < n; i++) {
|
|
regs.add(regsLabel[i] = new JLabel("$0000"));
|
|
}
|
|
add(regs, BorderLayout.SOUTH);
|
|
updateRegs();
|
|
}
|
|
}
|
|
|
|
public void updateRegs() {
|
|
if (regsLabel != null) {
|
|
for (int i = 0, n = 16; i < n; i++) {
|
|
regsLabel[i].setText("$" + Utils.hex16(cpu.reg[i]));
|
|
}
|
|
}
|
|
repaint();
|
|
}
|
|
|
|
private class DbgListModel extends AbstractListModel {
|
|
int startPos = -1;
|
|
int endPos = -1;
|
|
final int size = 21;
|
|
|
|
DbgInstruction[] instructions = new DbgInstruction[size];
|
|
|
|
// 64K Dbg instructions...
|
|
private DbgInstruction[] instrs = new DbgInstruction[0x10000];
|
|
|
|
public void setCurrentAddress(int address) {
|
|
startPos = address;
|
|
}
|
|
|
|
// -------------------------------------------------------------------
|
|
// ListAPI
|
|
// -------------------------------------------------------------------
|
|
|
|
public int getSize() {
|
|
return size;
|
|
}
|
|
|
|
private void checkPC() {
|
|
int pc = cpu.reg[cpu.PC];
|
|
if (pc < startPos || pc > endPos) {
|
|
startPos = pc;
|
|
// recalulate index!!! with PC at the top of the "page"
|
|
int currentPos = pc;
|
|
DbgInstruction inst;
|
|
for (int i = 0, n = size; i < n; i++) {
|
|
if (cpu.getExecCount(currentPos) != 0 || true) {
|
|
inst = disAsm.getDbgInstruction(currentPos, cpu);
|
|
inst.setPos(currentPos);
|
|
currentPos += inst.getSize();
|
|
} else {
|
|
inst = new DbgInstruction();
|
|
inst.setASMLine(" " + Utils.hex16(currentPos) + " " +
|
|
Utils.hex8(cpu.memory[currentPos]) + " " +
|
|
Utils.hex8(cpu.memory[currentPos + 1]) +
|
|
" .word " + Utils.hex8(cpu.memory[currentPos]) +
|
|
Utils.hex8(cpu.memory[currentPos + 1]));
|
|
inst.setPos(currentPos);
|
|
currentPos += 2;
|
|
}
|
|
instructions[i] = inst;
|
|
}
|
|
endPos = currentPos;
|
|
}
|
|
}
|
|
|
|
// Should cache the current 20 (or size) instructions to get a faster
|
|
// version of this...
|
|
// And have a call to "update" instead...
|
|
public Object getElementAt(int index) {
|
|
checkPC();
|
|
return instructions[index];
|
|
}
|
|
}
|
|
|
|
class MyCellRenderer extends JLabel implements ListCellRenderer {
|
|
|
|
public MyCellRenderer() {
|
|
setOpaque(true);
|
|
}
|
|
|
|
public Component getListCellRendererComponent(
|
|
JList list,
|
|
Object value, // value to display
|
|
int index, // cell index
|
|
boolean isSelected, // is the cell selected
|
|
boolean cellHasFocus) // the list and the cell have the focus
|
|
{
|
|
String s;
|
|
int pos = 0;
|
|
if (value == null) {
|
|
s = "---";
|
|
} else {
|
|
if (value instanceof DbgInstruction) {
|
|
DbgInstruction i = (DbgInstruction) value;
|
|
s = i.getASMLine(false);
|
|
if (i.getFunction() != null) {
|
|
s += "; " + i.getFunction();
|
|
}
|
|
pos = i.getPos();
|
|
if (cpu.hasBreakPoint(pos)) {
|
|
s = "*B " + s;
|
|
} else {
|
|
s = " " + s;
|
|
}
|
|
} else {
|
|
s = value.toString();
|
|
}
|
|
}
|
|
setText(s);
|
|
if (pos == cpu.reg[cpu.PC]) {
|
|
setBackground(Color.green);
|
|
} else {
|
|
if (isSelected) {
|
|
setBackground(list.getSelectionBackground());
|
|
setForeground(list.getSelectionForeground());
|
|
} else {
|
|
setBackground(list.getBackground());
|
|
setForeground(list.getForeground());
|
|
}
|
|
}
|
|
setEnabled(list.isEnabled());
|
|
setFont(list.getFont());
|
|
return this;
|
|
}
|
|
}
|
|
}
|