📄 cpu.java
字号:
package cpu;
import memory.*;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
import equipment.*;
import equipment.VirtualEquipment.EquipmentBusyException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
*该类模拟了操作系统中的CPU(中央处理器单元)
*
*@version 1.0
*@author Hinker from Hebei University
*/
public class CPU extends JPanel{
private static final long serialVersionUID = -8578888626890705510L;
/**
*程序计数器
*/
public static int PC;//程序计数器
/**
*程序状态寄存器
*/
public static int PSW;//程序状态寄存器;
/**
*代表程序状态寄存器的无中断状态
*/
public static final int NONE_INTERMIT=0;//无中断
/**
*代表程序状态寄存器的时间片到中断状态
*/
public static final int TIME_INTERMIT=1;//时间片到中断
/**
*代表程序状态寄存器的程序正常结束软中断状态
*/
public static final int NORMAL_END_SOFT_INTERMIT=2;//程序正常结束软中断
/**
*代表程序状态寄存器的申请设备中断状态
*/
public static final int APPLY_EQUIPMENT_INTERMIT=3;//申请设备中断
/**
*指令寄存器
*/
public static final char[] IR=new char[3];//指令寄存器
/**
*数据在内存中的索引表
*/
public static DataTable dTable;//数据在内存中的索引表
private static int timesize=5;//时间片大小
private static JProgressBar progress;
private JTextField txt;
private static JSlider slider;
private static JTextField field;
private static JTextArea middleResult;
public CPU(){
setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"CPU(中央处理器单元)(吴侃)"));
//滑块
slider=new JSlider(2,15,timesize);
slider.setMajorTickSpacing(2);
slider.setMinorTickSpacing(1);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
slider.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent event){
timesize=slider.getValue();
txt.setText(String.valueOf(timesize));
progress.setMaximum(timesize);
}
});
//文本域
JPanel panel=new JPanel();
JLabel timeLabel=new JLabel("时间片的大小:");
timeLabel.setEnabled(false);
panel.add(timeLabel);
panel.add(txt=new JTextField(10));
txt.setEditable(false);
timesize=slider.getValue();
txt.setText(String.valueOf(timesize));
//水平箱子
Box box=Box.createVerticalBox();
box.add(slider);
box.add(panel);
//当前正在执行的指令
JPanel fieldPanel=new JPanel();
JLabel fieldLabel=new JLabel("正在执行指令:");
fieldLabel.setEnabled(false);
fieldPanel.add(fieldLabel);
fieldPanel.add(field=new JTextField(10));
field.setEditable(false);
box.add(fieldPanel);
//中间结果
middleResult=new JTextArea(4,10);
middleResult.setBackground(new Color(0x6699ff));
middleResult.setForeground(Color.yellow);
middleResult.setEditable(false);
JPanel middlePanel=new JPanel();
middlePanel.setPreferredSize(new Dimension(30,120));
middlePanel.add(new JScrollPane(middleResult));
middlePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"中间结果"));
box.add(middlePanel);
//进度条
progress=new JProgressBar(0,timesize);
box.add(progress);
add(box);
}
/**
*调用run()将使CPU运行
*/
public static void run(){
int hasExecuteOrderNum=1;
String order="";//指令
int time=timesize;
while(true){
if(PSW==CPU.NORMAL_END_SOFT_INTERMIT)return;
if(CPU.PSW==CPU.TIME_INTERMIT)return;
else if(PSW==CPU.APPLY_EQUIPMENT_INTERMIT){
return;
}
//进度条指示
progress.setValue(hasExecuteOrderNum++);
order=MemoryPanel.readUserArea(PC);
//当前正在执行的指令
field.setText(order);
for(int i=0;i<3;i++)IR[i]=order.charAt(i);
executeOrder();
//显示中间结果
VeriableIndex[] result=dTable.getVeriableAddress();
String resultString="";
if(result!=null){
for(int i=0;i<result.length;i++){
resultString+=(result[i].getVariable()+"=");
resultString+=(MemoryPanel.readUserArea(result[i].getIndex())+"\n");
}
}
middleResult.setText(resultString);
time--;
/*如果时间片到了而程序还未正常结束就把PSW的状态设置成时间片到中断,
*但是如果时间片到了此时程序正好结束就把PSW设置成程序正常结束软中
*断而忽略时间片到中断*/
if(time==0&&CPU.PSW!=CPU.NORMAL_END_SOFT_INTERMIT)
CPU.PSW=CPU.TIME_INTERMIT;
PC++;
}
}
private static void executeOrder(){
int address;
int variable;
if(IR[0]=='e'&&IR[1]=='n'&&IR[2]=='d'){
PSW=CPU.NORMAL_END_SOFT_INTERMIT;
return;
}
else if(IR[0]=='!'){
try {
EquipmentManagePanel.applyEquipment(IR[1], IR[2]);
} catch (EquipmentBusyException e) {
PSW=CPU.APPLY_EQUIPMENT_INTERMIT;//设备中断
}
return;
}//设备管理
else{
address=dTable.queryTableItem(IR[0]);
if(IR[1]=='='){
variable=IR[2]-48;
MemoryPanel.writeUserArea(String.valueOf(variable), address);
}
else if(IR[1]=='+'){
int result=Integer.parseInt(MemoryPanel.readUserArea(address))+1;
MemoryPanel.writeUserArea(String.valueOf(result), address);
}
else if(IR[1]=='-'){
int result=Integer.parseInt(MemoryPanel.readUserArea(address))-1;
MemoryPanel.writeUserArea(String.valueOf(result), address);
}
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -