⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframe.java

📁 一个微处理器的模似器
💻 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 + -