Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
15.04 Кб
Скачать
package GUI;

import interpretator_ASM.Interpretator;

import java.io.*;
import java.util.Vector;

import org.eclipse.swt.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

import IO_base.IOBase;

public class GUI extends Thread implements Runnable{
private Display display;
private Shell shell;
private Group registersList;
private Menu menu;
private Vector<String[]> asmCode = new Vector<String[]>();
private Vector<String[]> readedAsmCode = new Vector<String[]>();

private Group fRegsList;
private Composite memory;
private TabFolder procMem;
private Composite logComp;
private Table readedLog;
private Composite flagComp;

public GUI(BufferedReader inputFile){
int i =0;
String s;
String parse[] = new String[5];
Interpretator.resetVars();
try{
while((s = inputFile.readLine()) != null){
i++;
//System.out.println(s);
if(!s.startsWith(";") && s.length()!=0){
parse=Interpretator.checkASMCode(s);
if(parse==null){
System.err.println("Errors in code exists. Line "+i);
System.exit(1);
}else if(parse[0]!=null)
asmCode.add(parse);
}
}
}catch(IOException e){
System.err.println("Couldn't read code from input file");
System.exit(1);
}
System.out.println(asmCode.size()+" total lines of code readed");
}

private void createShell(){
shell = new Shell(SWT.MIN);
shell.setText("RISC emulator");
shell.setSize(800, 600);
shell.setLayout(new FormLayout());
}

private void drawShell(){
drawMemTable();
drawLogMenu();
drawFlagsInfo();

//меню шапки
menu = new Menu(shell, SWT.BAR);
shell.setMenuBar(menu);
MenuItem file = new MenuItem(menu, SWT.CASCADE);
file.setText("File");
MenuItem help = new MenuItem(menu, SWT.CASCADE);
help.setText("Help");
Menu filemenu = new Menu(shell, SWT.DROP_DOWN);
file.setMenu(filemenu);
Menu helpmenu = new Menu(shell, SWT.DROP_DOWN);
help.setMenu(helpmenu);
MenuItem actionItem = new MenuItem(filemenu, SWT.PUSH);
actionItem.setText("Src code location");
actionItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
try {
codeLocationMenu();
} catch (IOException e1) {
System.err.println("Couldn't read code file becarse: "+e1);
}
}
});
MenuItem helpItem = new MenuItem(helpmenu, SWT.PUSH);
helpItem.setText("Help");
helpItem.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e){
viewHelp();
}
});
MenuItem separator = new MenuItem(helpmenu, SWT.SEPARATOR);
MenuItem aboutItem = new MenuItem(helpmenu, SWT.PUSH);
aboutItem.setText("About");
aboutItem.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e){
viewAbout();
}
});
}

//список регистров
private void drawMemTable(){
procMem = new TabFolder(shell,SWT.NONE);
//целочисленные регистры
registersList = new Group(procMem, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 16;
registersList.setLayout(layout);
fillRegNames();

TabItem item1 = new TabItem(procMem,SWT.NONE);
item1.setText("Registers");
item1.setControl(registersList);

//регистры с плавающей точкой
fRegsList = new Group(procMem, SWT.NONE);
//GridLayout layout = new GridLayout();
//layout.numColumns = 16;
fRegsList.setLayout(layout);
fillFRegNames();

TabItem item2 = new TabItem(procMem,SWT.NONE);
item2.setText("Float Regs");
item2.setControl(fRegsList);

//память. первые 128 bytes (1024 bit)
memory = new Composite(procMem,SWT.NONE);
memory.setLayout(layout);
fillMemoryInfo();

TabItem item3 = new TabItem(procMem,SWT.NONE);
item3.setText("Memory (first 128 bytes)");
item3.setControl(memory);

//выводим на экран состояние памяти
FormData formFill = new FormData();
formFill.top = new FormAttachment(0, 10);
formFill.left = new FormAttachment(0, 10);
//formFill.bottom = new FormAttachment(35, 0);
//formFill.right = new FormAttachment(60,0);
procMem.setLayoutData(formFill);
}

//меню лога
private void drawLogMenu(){
logComp = new Composite(shell,SWT.NONE);
int x1,x2,y1,y2;
x1=0; x2=300; y1=0; y2=20;

//прочитанные команды
Label top = new Label(logComp,SWT.NONE);
top.setText("Already readed commands");
top.setBounds(x1, y1, x2, y2);

readedLog = new Table(logComp,SWT.BORDER|SWT.V_SCROLL);
y1+=y2+3;
y2=150;

readedLog.setBounds(x1, y1, x2, y2);
readedLog.setHeaderVisible(true);
readedLog.setLinesVisible(true);

TableColumn commName = new TableColumn(readedLog,SWT.LEFT);
commName.setText("Command Name");
commName.setWidth(90);
TableColumn rgReceiver = new TableColumn(readedLog,SWT.RIGHT);
rgReceiver.setText("Receiver");
rgReceiver.setWidth(60);
TableColumn source = new TableColumn(readedLog,SWT.RIGHT);
source.setText("Source ");
source.setWidth(50);
TableColumn code = new TableColumn(readedLog,SWT.RIGHT);
code.setText("Code");
code.setWidth(80);

//заполним лог прочитанной информацией
if(readedAsmCode.size()!=0){
TableItem readed[] = new TableItem[readedAsmCode.size()];
//System.out.println("readed items "+ readed.length);
for(int i=0; i<readedAsmCode.size();i++){
readed[i]=new TableItem(readedLog,SWT.NONE);
String[] tmp = new String[4];
tmp[0]=readedAsmCode.elementAt(i)[0];
tmp[1]=readedAsmCode.elementAt(i)[1];
if(tmp[0].equalsIgnoreCase("add") || tmp[0].equalsIgnoreCase("fadd"))
tmp[2]=readedAsmCode.elementAt(i)[2]+"+"+readedAsmCode.elementAt(i)[3];
else if(tmp[0].equalsIgnoreCase("mul") || tmp[0].equalsIgnoreCase("mul"))
tmp[2]=readedAsmCode.elementAt(i)[2]+"*"+readedAsmCode.elementAt(i)[3];
else tmp[2]=readedAsmCode.elementAt(i)[2];
tmp[3]=readedAsmCode.elementAt(i)[4];
readed[i].setText(tmp);
}
}
//readedLog.setSelection(readedAsmCode.size());

//кнопка для чтения очередной команды
Button nextCodeButton = new Button(logComp,SWT.PUSH);
nextCodeButton.setText("Read next code");
y1+=y2+3;
y2=30;
nextCodeButton.setBounds(x1, y1, x2, y2);
nextCodeButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
readNextCode();
}
});

//непрочитанные команды
Label bottom = new Label(logComp,SWT.NONE);
bottom.setText("Commands to read");
y1+=y2+3;
y2=20;
bottom.setBounds(x1, y1, x2, y2);

Table logToRead = new Table(logComp,SWT.BORDER|SWT.V_SCROLL);
y1+=y2+3;
y2=150;
logToRead.setBounds(x1, y1, x2, y2);
logToRead.setHeaderVisible(true);
logToRead.setLinesVisible(true);

TableColumn commName2 = new TableColumn(logToRead,SWT.LEFT);
commName2.setText("Command Name");
commName2.setWidth(90);
TableColumn rgReceiver2 = new TableColumn(logToRead,SWT.RIGHT);
rgReceiver2.setText("Receiver");
rgReceiver2.setWidth(60);
TableColumn source2 = new TableColumn(logToRead,SWT.RIGHT);
source2.setText("Source ");
source2.setWidth(50);
TableColumn code2 = new TableColumn(logToRead,SWT.RIGHT);
code2.setText("Code");
code2.setWidth(80);

//заполним лог информацией которую надо считать
if(asmCode.size()!=0){
TableItem read[] = new TableItem[asmCode.size()];
//System.out.println("left items "+ asmCode.size());
for(int i=0; i<asmCode.size();i++){
read[i]=new TableItem(logToRead,SWT.NONE);
String[] tmp = new String[4];
tmp[0]=asmCode.elementAt(i)[0];
tmp[1]=asmCode.elementAt(i)[1];
if(tmp[0].equalsIgnoreCase("add") || tmp[0].equalsIgnoreCase("fadd"))
tmp[2]=asmCode.elementAt(i)[2]+"+"+asmCode.elementAt(i)[3];
else if(tmp[0].equalsIgnoreCase("mul") || tmp[0].equalsIgnoreCase("mul"))
tmp[2]=asmCode.elementAt(i)[2]+"*"+asmCode.elementAt(i)[3];
else tmp[2]=asmCode.elementAt(i)[2];
tmp[3]=asmCode.elementAt(i)[4];
read[i].setText(tmp);
}
}

//выводим лог на форму
FormData formLog = new FormData();
formLog.top = new FormAttachment(0, 10);
formLog.left = new FormAttachment(procMem, 10);
formLog.bottom = new FormAttachment(SWT.BOTTOM,10);
formLog.right = new FormAttachment(100, -10);
logComp.setLayoutData(formLog);
}

//меню флагов
private void drawFlagsInfo(){
flagComp = new Composite(shell,SWT.NONE);
Label flagsLabel = new Label(flagComp,SWT.NONE);
flagsLabel.setText("Flags state");
flagsLabel.setBounds(0, 0, 100, 20);

Table flagsTable = new Table(flagComp,SWT.BORDER);
flagsTable.setBounds(0, 23, 145, 37);
flagsTable.setHeaderVisible(true);
flagsTable.setLinesVisible(true);

TableColumn flagZ = new TableColumn(flagsTable,SWT.RIGHT);
flagZ.setText("Z");
flagZ.setWidth(20);
TableColumn flagC = new TableColumn(flagsTable,SWT.RIGHT);
flagC.setText("C");
flagC.setWidth(20);
TableColumn flagS = new TableColumn(flagsTable,SWT.RIGHT);
flagS.setText("S");
flagS.setWidth(20);
TableColumn flagO = new TableColumn(flagsTable,SWT.RIGHT);
flagO.setText("O");
flagO.setWidth(20);
TableColumn flagI = new TableColumn(flagsTable,SWT.RIGHT);
flagI.setText("I");
flagI.setWidth(20);
TableColumn flagT = new TableColumn(flagsTable,SWT.RIGHT);
flagT.setText("T");
flagT.setWidth(20);
TableColumn flagU = new TableColumn(flagsTable,SWT.RIGHT);
flagU.setText("U");
flagU.setWidth(20);

//заполним таблицу информацией о флагах
String[] flInf = getFlags();
if(flInf!=null){
TableItem fInfo = new TableItem(flagsTable,SWT.NONE);
fInfo.setText(flInf);
}
//выводим состояние флагов на экран
FormData formFlags = new FormData();
formFlags.top = new FormAttachment(procMem,10);
formFlags.bottom = new FormAttachment(SWT.BOTTOM,10);
formFlags.left = new FormAttachment(0,10);
//formFlags.right = new FormAttachment(logComp,10);
flagComp.setLayoutData(formFlags);
}



private void fillMemoryInfo() {
Label label[] = new Label[64];
Label label2[] = new Label[64];
byte[] mem = IOBase.getFirst128bytesOfMem();
if(mem!=null){
for(int i=0;i<64;i++){
label[i] = new Label(memory, SWT.NONE);
label[i].setText(""+mem[i]);
}
for(int i=0;i<64;i++){
label2[i] = new Label(memory,SWT.NONE);
label2[i].setText(""+mem[i+64]);
}
}
}

private void fillFRegNames() {
Label label[] = new Label[64];
Label label2[] = new Label[64];
byte[] regs = IOBase.getProcFRegsState();
int j=0;
byte[] reg = new byte[4];
for(int i=1;i<=64;i++){
label[i-1] = new Label(fRegsList, SWT.NONE);
label[i-1].setText("FR"+i);
if(!IOBase.isSupervizor() && i>16)
label2[i-1] = new Label(fRegsList, SWT.NONE);
else label2[i-1] = new Label(fRegsList, SWT.BORDER);
for(int k=0;k<4;k++){
reg[k]=regs[j];
j++;
}

//label2[i-1].setText(""+Interpretator.BitToFloat(reg));
label2[i-1].setText("0");
}
}

private String[] getFlags() {

byte[] flags = Interpretator.DecToBin((int)IOBase.getSystemFlags(),7);
String[] result = new String[flags.length];
//System.out.println(flags.length);
for(int i=0;i<flags.length;i++){
result[i]=""+flags[i];
}
return result;
}

private void fillRegNames() {
Label label[] = new Label[64];
Label label2[] = new Label[64];
byte[] regs = IOBase.getProcRegsState();
int j=0;
byte[] reg = new byte[4];
for(int i=1;i<=64;i++){
label[i-1] = new Label(registersList, SWT.NONE);
label[i-1].setText("R"+i);
if(!IOBase.isSupervizor() && i>16)
label2[i-1] = new Label(registersList, SWT.NONE);
else label2[i-1] = new Label(registersList, SWT.BORDER);
for(int k=0;k<4;k++){
reg[k]=regs[j];
j++;
}
label2[i-1].setText(""+Interpretator.BitToDec(reg));
}
}

public void run() {
createShell();
drawShell();
shell.open();
display = shell.getDisplay();
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}

private void viewHelp(){
MessageBox messageBox = new MessageBox(shell, SWT.ICON_INFORMATION |
SWT.OK);
messageBox.setMessage("1. Choose the file with code that you want to emulate\n" +
"2. Watch how the registers state changes by clicking on the readNextCode\n" +
"button");
messageBox.setText("Help");
messageBox.open();
}

private void viewAbout(){
MessageBox messageBox = new MessageBox(shell, SWT.ICON_INFORMATION |
SWT.OK);
messageBox.setMessage("This programm written by Ephimov Andrey\n" +
"And it pretended to emulate RISC processor");
messageBox.setText("About");
messageBox.open();
}

private void codeLocationMenu() throws IOException{
String[] filterExtensions = {"*.txt"};
FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
fileDialog.setText("Choose file with code");
fileDialog.setFilterPath("./");
fileDialog.setFilterExtensions(filterExtensions);
String selectedFile = fileDialog.open();
System.out.println("File Selected:" + selectedFile);

if(selectedFile!=null){
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream(selectedFile)));
asmCode=new Vector<String[]>();
readedAsmCode=new Vector<String[]>();
String s;
String parse[] = new String[5];
try{
while((s = in.readLine()) != null){
//System.out.println(s);
parse=Interpretator.checkASMCode(s);
if(parse==null){
System.err.println("Errors in code exists");
System.exit(1);
}else
asmCode.add(parse);
}
}catch(IOException e){
System.err.println("Couldn't read code from input file");
System.exit(1);
}
System.out.println(asmCode.size()+" total lines of code readed");
redrawWindow();
}
}

private void redrawWindow() {
procMem.dispose();
drawMemTable();
logComp.dispose();
//logComp.update();
//logComp.redraw();
drawLogMenu();
flagComp.dispose();
drawFlagsInfo();
shell.layout();
}

private void readNextCode(){
//System.out.println("ReadNextCode button pressed "+readedAsmCode.size()+" "+asmCode.size());
try{
String[] read = asmCode.elementAt(0);
readedAsmCode.add(asmCode.remove(0));

Interpretator.callCommand(read);
//перерисовываем таблички
redrawWindow();
}catch(Exception e){
System.err.println("RISC GUI: Couldn't read next asm code.");
if(asmCode.size()==0)
System.err.println("No more code available");
e.printStackTrace();
}
}
}
Соседние файлы в папке GUI