?? 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 + -