📄 mainframe.java
字号:
/*
* MainFrame.java
*
* Created on __DATE__, __TIME__
*/
package com.vmpu.shell;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.table.DefaultTableModel;
import com.vmpu.core.MicroProcessingUnit;
/**
*
* @author __USER__
*/
public class MainFrame extends javax.swing.JFrame {
private MicroProcessingUnit mpu = new MicroProcessingUnit(2);
private JFileChooser fileChooser = new JFileChooser();
/**
*
*/
private static final long serialVersionUID = 8574787201436496728L;
/** Creates new form MainFrame */
public MainFrame() {
this.setTitle("虚拟微处理器V1.0");
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
mainPanel = new javax.swing.JPanel();
registerScrollPane = new javax.swing.JScrollPane();
registerTable = new javax.swing.JTable();
instructSrcollPane = new javax.swing.JScrollPane();
instructList = new javax.swing.JList();
dataScrollPane = new javax.swing.JScrollPane();
dataEditorPane = new javax.swing.JEditorPane();
stepButton = new javax.swing.JButton();
loadButton = new javax.swing.JButton();
runButton = new javax.swing.JButton();
dataEditorPane.setEditable(false);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
mainPanel.setBorder(javax.swing.BorderFactory
.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
DefaultTableModel tableModel = new DefaultTableModel();
registerTable.setModel(tableModel);
DefaultListModel listModel = new DefaultListModel();
instructList.setModel(listModel);
registerScrollPane.setViewportView(registerTable);
instructSrcollPane.setViewportView(instructList);
dataScrollPane.setViewportView(dataEditorPane);
org.jdesktop.layout.GroupLayout mainPanelLayout = new org.jdesktop.layout.GroupLayout(
mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout.setHorizontalGroup(mainPanelLayout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING).add(
mainPanelLayout.createSequentialGroup().addContainerGap().add(
registerScrollPane,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 227,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED).add(
instructSrcollPane,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
93,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED).add(
dataScrollPane,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
418, Short.MAX_VALUE).addContainerGap()));
mainPanelLayout.setVerticalGroup(mainPanelLayout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING).add(
org.jdesktop.layout.GroupLayout.TRAILING,
mainPanelLayout.createSequentialGroup().addContainerGap().add(
mainPanelLayout.createParallelGroup(
org.jdesktop.layout.GroupLayout.TRAILING).add(
org.jdesktop.layout.GroupLayout.LEADING,
dataScrollPane,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
405, Short.MAX_VALUE).add(
org.jdesktop.layout.GroupLayout.LEADING,
instructSrcollPane,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
405, Short.MAX_VALUE).add(
org.jdesktop.layout.GroupLayout.LEADING,
registerScrollPane,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
405, Short.MAX_VALUE)).addContainerGap()));
stepButton.setText("\u5355\u6b65\u8fd0\u884c(F7)");
stepButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mpu.step();
instructList.setSelectedIndex(mpu.getInstrFetcher().getPc() / 2);
loadRegisters(mpu);
loadData(mpu);
}
});
loadButton.setText("\u88c5\u8f7d(Ctrl+L)");
loadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
int value = fileChooser.showOpenDialog(MainFrame.this);
if(value == JFileChooser.APPROVE_OPTION) {
try {
mpu.load(fileChooser.getSelectedFile().getPath());
} catch (IOException e) {
e.printStackTrace();
}
loadRegisters(mpu);
loadInstructs(mpu);
loadData(mpu);
}
}
});
runButton.setText("\u8fd0\u884c(F9)");
runButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mpu.start();
final JDialog running = new JDialog(MainFrame.this,true);
running.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
running.setSize(200, 50);
running.getContentPane().add(new JLabel("正在运行,请稍候……"));
int x = MainFrame.this.getX() + (MainFrame.this.getWidth() - running.getWidth()) / 2;
int y = MainFrame.this.getY() + (MainFrame.this.getHeight() - running.getHeight()) / 2;
running.setLocation(x, y);
running.pack();
Thread check = new Thread() {
public void run() {
while(mpu.isRunning())
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
loadRegisters(mpu);
loadData(mpu);
running.dispose();
}
};
check.start();
if(running != null) running.setVisible(true);
}
});
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout
.setHorizontalGroup(layout
.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(
layout
.createSequentialGroup()
.addContainerGap()
.add(
layout
.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(
mainPanel,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.add(
layout
.createSequentialGroup()
.add(
runButton)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(
stepButton)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED,
477,
Short.MAX_VALUE)
.add(
loadButton)))
.addContainerGap()));
layout.setVerticalGroup(layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING).add(
layout.createSequentialGroup().addContainerGap().add(
layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE).add(
loadButton).add(runButton).add(stepButton))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED).add(
mainPanel,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE).addContainerGap()));
pack();
}// </editor-fold>//GEN-END:initComponents
private void loadRegisters(MicroProcessingUnit mpu) {
javax.swing.table.DefaultTableModel model = (DefaultTableModel) registerTable
.getModel();
Object[] columns = new String[] {"寄存器名","寄存器值"};
Object[][] data = new String[][] {
{"程序计数器PC",changeTo16(mpu.getInstrFetcher().getPc()) + "("+ (int)mpu.getInstrFetcher().getPc()+")"},
{"指令寄存器",changeTo16(mpu.getInstrFetcher().getInstrReg())},
{"控制信号寄存器",changeTo16(mpu.getController().getCtrlSgnlReg())},
{"立即数寄存器1",changeTo16(mpu.getController().getImmReg1()) },
{"立即数寄存器2",changeTo16(mpu.getController().getImmReg2()) },
{"标志寄存器",changeTo16((char) mpu.getExecutor().getFlagReg()) },
{"通用寄存器0",changeTo16(mpu.getExecutor().getRegs()[0]) + "("+ (int)mpu.getExecutor().getRegs()[0]+")"},
{"通用寄存器1",changeTo16(mpu.getExecutor().getRegs()[1]) + "("+ (int)mpu.getExecutor().getRegs()[1]+")"},
{"通用寄存器2",changeTo16(mpu.getExecutor().getRegs()[2]) + "("+ (int)mpu.getExecutor().getRegs()[2]+")"},
{"通用寄存器3",changeTo16(mpu.getExecutor().getRegs()[3]) + "("+ (int)mpu.getExecutor().getRegs()[3]+")"}};
model.setDataVector(data, columns);
}
private void loadInstructs(MicroProcessingUnit mpu) {
DefaultListModel model = (DefaultListModel) instructList.getModel();
model.removeAllElements();
for (int i = 0; i < mpu.getInstrFetcher().getInstrCache().length; i++) {
int instr = 0;
instr |= mpu.getInstrFetcher().getInstrCache()[i++] << 8;
if(instr == 0) break;
instr |= mpu.getInstrFetcher().getInstrCache()[i];
model.addElement(changeTo16((char) instr));
}
instructList.setSelectedIndex(mpu.getInstrFetcher().getPc() / 2);
}
private void loadData(MicroProcessingUnit mpu) {
dataEditorPane.removeAll();
String all = "";
for (int i = 0; i < 64; i++) {
String line = "";
for (int j = 0; j < 16; j++) {
line += changeTo16(mpu.getExecutor().getDataCache()[j]) + " ";
}
line += "\n";
all += line;
}
dataEditorPane.setText(all);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrame().setVisible(true);
}
});
}
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JEditorPane dataEditorPane;
private javax.swing.JScrollPane dataScrollPane;
private javax.swing.JList instructList;
private javax.swing.JScrollPane instructSrcollPane;
private javax.swing.JButton loadButton;
private javax.swing.JPanel mainPanel;
private javax.swing.JScrollPane registerScrollPane;
private javax.swing.JTable registerTable;
private javax.swing.JButton runButton;
private javax.swing.JButton stepButton;
// End of variables declaration//GEN-END:variables
private static String changeTo16(char data) {
String result = "";
int d = (data >>> 12) & 0x000F;
result += to16(d);
d = (data >>> 8) & 0x000F;
result += to16(d);
d = (data >>> 4) & 0x000F;
result += to16(d);
d = data & 0x000F;
result += to16(d);
return result;
}
private static String changeTo16(byte data) {
String result = "";
int d = (data >>> 4) & 0x000F;
result += to16(d);
d = data & 0x000F;
result += to16(d);
return result;
}
private static String to16(int data) {
String result = "";
if (data < 10)
result += data;
else
switch (data) {
case 10:
result += "A";
break;
case 11:
result += "B";
break;
case 12:
result += "C";
break;
case 13:
result += "D";
break;
case 14:
result += "E";
break;
case 15:
result += "F";
break;
}
return result;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -