Скачиваний:
30
Добавлен:
03.06.2014
Размер:
36.66 Кб
Скачать
package architecture;

import architecture.*;
import java.io.*;
import java.lang.*;
import java.util.StringTokenizer;

public class Risc {
protected boolean supervisor;
protected long R[] = new long[32];
protected double F[] = new double[32];
protected long TLBP;
protected long BVA;
protected long TINT;
protected char flags;
protected char fflags;
protected long PC, num;
protected Conveier conv1,conv2;
boolean regBuzyR[] = new boolean[32];
boolean regBuzyF[] = new boolean[32];
String[] prog;
Processor md;
Assembly as;

protected char memory[] = new char[32768];

public void setGUI(Processor md, Assembly as) {
this.md = md;
this.as = as;
}

public Risc() {
for(int i=0;i<32;i++) R[i]=0;
for(int i=0;i<32;i++) F[i]=0;
for(int i=0;i<32;i++) regBuzyR[i]=regBuzyF[i]=false;
PC=num=0;
BVA=0xFA90;
TLBP=TINT=0x1100;
flags=fflags=0;
conv1 = new Conveier();
conv2 = new Conveier();
supervisor = false;
}

public void onReset() {
for(int i=0;i<32;i++) R[i]=0;
for(int i=0;i<32;i++) F[i]=0;
for(int i=0;i<32;i++) regBuzyR[i]=regBuzyF[i]=false;
PC=num=0;
BVA=0xFA90;
TLBP=TINT=0x1100;
flags=fflags=0;
conv1 = new Conveier();
conv2 = new Conveier();
supervisor = false;
as.clearAll();
}

public void setComandList(String [] comList) {
this.prog=comList;
};

protected long memDefine(int offset, int bytes) {
long a=0;
if(offset>=16384&&(flags&1)==0) {
System.err.println("Attempting to read system memory! Access denied.");
return 0;
}
for(int i=0;i<bytes;i++) {
a |= (((long) memory[offset + i]) << i*8);
}
return a;
}
protected void memWrite(int offset, long value,int bytes) {
if(offset>=16384&&(flags&1)==0) {
System.err.println("Attempting to write system memory! Access denied.");
return;
}
for(int i=0;i<bytes;i++) {
memory[offset + i] = (char)((value>>(i*8))&255);
}
if(offset<60) md.writeToRAM(value,offset,bytes);
}


public long runNextCommand() {
int count=prog.length;
Command command;
//блок выборки команд
as.setCommandA("");
as.setCommandIdSelectionBlockA(-1);
as.setCommandB("");
as.setCommandIdSelectionBlockB(-1);
if(PC>=count) return -1;
if(num >= count) {
conveierIteration();
return PC;
}
if (!conv1.buzy && conv1.command1 == null) {
(command = new Command()).command = prog[(int)num];
conv1.command1 = command;
as.setCommandA(prog[(int)num]);
as.setCommandIdSelectionBlockA((long)num);
conv1.command1.counter = (int)num;
num++;
}
if (!conv2.buzy && conv2.command1 == null) {
if (num >= count) {
conveierIteration();
return PC;
}
(command = new Command()).command = prog[(int)num];
conv2.command1 = command;
as.setCommandB(prog[(int)num]);
as.setCommandIdSelectionBlockB((long)num);
conv2.command1.counter = (int)num;
num++;
}
conveierIteration();
return PC;
}

void conveierIteration() {
if (conv1.command4 != null && conv2.command4 != null &&
(conv1.command4.counter > conv2.command4.counter)) {
if (!conv2.stop) conv2.blockVozvrata();
if (!conv1.stop) conv1.blockVozvrata();
} else {
if (!conv1.stop) conv1.blockVozvrata();
if (!conv2.stop) conv2.blockVozvrata();
}
if (conv1.command3 != null && conv2.command3 != null &&
(conv1.command3.counter > conv2.command3.counter)) {
if (!conv2.stop) conv2.blockALU();
if (!conv1.stop) conv1.blockALU();
} else {
if (!conv1.stop) conv1.blockALU();
if (!conv2.stop) conv2.blockALU();
}
if (conv1.command2 != null && conv2.command2 != null &&
(conv1.command2.counter > conv2.command2.counter)) {
if (!conv2.stop) conv2.blockViboraOperandov();
if (!conv1.stop) conv1.blockViboraOperandov();
}
else {
if (!conv1.stop) conv1.blockViboraOperandov();
if (!conv2.stop) conv2.blockViboraOperandov();
}
if (conv1.command2 != null && conv2.command2 != null &&
(conv1.command2.counter > conv2.command2.counter)) {
if (!conv2.stop) conv2.blockDecoder();
else {
as.setCommandDecodedB( -1);
if (conv2.command1 != null) as.setCommandIdDecodingBlockB(conv2.
command1.counter);
else as.setCommandIdDecodingBlockB( -1);
}
if (!conv1.stop) conv1.blockDecoder();
else {
as.setCommandDecodedA( -1);
if (conv1.command1 != null) as.setCommandIdDecodingBlockA(conv1.
command1.counter);
else as.setCommandIdDecodingBlockA( -1);
}
}
else {
if (!conv1.stop) conv1.blockDecoder();
else {
as.setCommandDecodedA( -1);
if (conv1.command1 != null) as.setCommandIdDecodingBlockA(conv1.
command1.counter);
else as.setCommandIdDecodingBlockA( -1);
}
if (!conv2.stop) conv2.blockDecoder();
else {
as.setCommandDecodedB( -1);
if (conv2.command1 != null) as.setCommandIdDecodingBlockB(conv2.
command1.counter);
else as.setCommandIdDecodingBlockB( -1);
}
}
as.setRunningA(!conv1.stop);
as.setRunningB(!conv2.stop);
as.setBusyA(!conv1.buzy);
as.setBusyB(!conv2.buzy);
conv1.stop = false;
conv2.stop = false;
}

//***Устройство управления************************
protected boolean conveierControl(Conveier conv) {
if (conv.command2.comId >= 32 && conv.command2.comId <= 40) { //Jupm!
conv1.buzy = true;
conv2.buzy = true;
conv.command1=null;
if(conv.equals(conv1)) {
if((conv2.command1!=null&&conv.command2.counter>conv2.command1.counter)||(conv2.command2!=null&&conv.command2.counter>conv2.command2.counter)) {
conv.stop = true;
return false;
}
else {
conv2.command1=null;
conv2.command2=null;
}
}
else {
if((conv1.command1!=null&&conv.command2.counter>conv1.command1.counter)||(conv1.command2!=null&&conv.command2.counter>conv1.command2.counter)) {
conv.stop = true;
return false;
}
else {
conv1.command1=null;
conv1.command2=null;
}
}
} else if(conv.command2.comId >= 47 && conv.command2.comId <= 48) {
if(conv.equals(conv1)) {
if(conv2.command3!=null&&conv2.command3.counter>conv1.command2.counter) {
conv2.stop = true;
return false;
}
if(conv2.command1!=null&&conv2.command1.counter<conv1.command2.counter) {
conv1.stop = true;
return false;
}
if(conv2.stop) {
conv1.stop = true;
return false;
}
}
else {
if(conv1.command3!=null&&conv1.command3.counter>conv2.command2.counter) {
conv1.stop = true;
return false;
}
if(conv1.command1!=null&&conv1.command1.counter<conv2.command2.counter) {
conv2.stop = true;
return false;
}
if(conv1.stop) {
conv2.stop = true;
return false;
}

}
} else if (conv.command2.operNum > 0) { //Register check
if (conv.command2.strOper[0].charAt(0) == 'R') {
if (regBuzyR[conv.command2.regNum[0]]) {
conv.stop = true;
return false;
}
else regBuzyR[conv.command2.regNum[0]] = true;
}
if (conv.command2.strOper[0].charAt(0) == 'F') {
if (regBuzyF[conv.command2.regNum[0]]) {
conv.stop = true;
return false;
}
else regBuzyF[conv.command2.regNum[0]] = true;
}
}
return true;
}
protected void conveierResume(Conveier conv) {
if (conv.command4.comId >= 32 && conv.command4.comId <= 40) { //Jupm!
conv1.buzy = false;
conv2.buzy = false;
num=PC-1;
} else if (conv.command4.operNum > 0) {
if (conv.command4.strOper[0].charAt(0) == 'R') regBuzyR[conv.command4.regNum[0]] = false;
if (conv.command4.strOper[0].charAt(0) == 'F') regBuzyF[conv.command4.regNum[0]] = false;
}
}
//************************************************

class Conveier {
boolean buzy;
boolean stop;
Conveier() {
stop=false;
buzy=false;
}
Command command1 = null;
Command command2 = null;
Command command3 = null;
Command command4 = null;
void blockDecoder() {
if(command1==null) {
if (this.equals(conv1)) {
as.setCommandDecodedA(-1);
as.setCommandIdDecodingBlockA(-1);
}
else {
as.setCommandDecodedB(-1);
as.setCommandIdDecodingBlockB(-1);
}
return;
}
StringTokenizer st = new StringTokenizer(command1.command, " ");
String name = st.nextToken();
if(name.compareTo("RDHW")==0) command1.comId=0;
else if(name.compareTo("RDW")==0) command1.comId=1;
else if(name.compareTo("RDDW")==0) command1.comId=2;
else if(name.compareTo("WDHW")==0) command1.comId=3;
else if(name.compareTo("WRW")==0) command1.comId=4;
else if(name.compareTo("WRDW")==0) command1.comId=5;
else if(name.compareTo("IN")==0) command1.comId=6;
else if(name.compareTo("OUT")==0) command1.comId=7;
else if(name.compareTo("XCHG")==0) command1.comId=8;
else if(name.compareTo("MOVI")==0) command1.comId=9;
else if(name.compareTo("ADD")==0) command1.comId=12;
else if(name.compareTo("SUB")==0) command1.comId=13;
else if(name.compareTo("MUL")==0) command1.comId=14;
else if(name.compareTo("DIV")==0) command1.comId=15;
else if(name.compareTo("ADDI")==0) command1.comId=16;
else if(name.compareTo("SUBI")==0) command1.comId=17;
else if(name.compareTo("MULI")==0) command1.comId=18;
else if(name.compareTo("DIVI")==0) command1.comId=19;
else if(name.compareTo("AND")==0) command1.comId=20;
else if(name.compareTo("OR")==0) command1.comId=21;
else if(name.compareTo("XOR")==0) command1.comId=22;
else if(name.compareTo("NOT")==0) command1.comId=23;
else if(name.compareTo("RCL")==0) command1.comId=24;
else if(name.compareTo("RCR")==0) command1.comId=25;
else if(name.compareTo("CLI")==0) command1.comId=26;
else if(name.compareTo("STI")==0) command1.comId=27;
else if(name.compareTo("INT")==0) command1.comId=28;
else if(name.compareTo("IRET")==0) command1.comId=29;
else if(name.compareTo("CALL")==0) command1.comId=30;
else if(name.compareTo("RET")==0) command1.comId=31;
else if(name.compareTo("JMP")==0) command1.comId=32;
else if(name.compareTo("JZ")==0) command1.comId=33;
else if(name.compareTo("JNZ")==0) command1.comId=34;
else if(name.compareTo("JO")==0) command1.comId=35;
else if(name.compareTo("JNO")==0) command1.comId=36;
else if(name.compareTo("JC")==0) command1.comId=37;
else if(name.compareTo("JNC")==0) command1.comId=38;
else if(name.compareTo("JS")==0) command1.comId=39;
else if(name.compareTo("JNS")==0) command1.comId=40;
else if(name.compareTo("RFL")==0) command1.comId=41;
else if(name.compareTo("WFL")==0) command1.comId=42;
else if(name.compareTo("RTLBR")==0) command1.comId=43;
else if(name.compareTo("WTLBR")==0) command1.comId=44;
else if(name.compareTo("RISR")==0) command1.comId=45;
else if(name.compareTo("WISR")==0) command1.comId=46;
else if(name.compareTo("RFE")==0) command1.comId=47;
else if(name.compareTo("SCALL")==0) command1.comId=48;
else if(name.compareTo("HALT")==0) command1.comId=49;
else if(name.compareTo("NOP")==0) command1.comId=50;
else if(name.compareTo("RBVA")==0) command1.comId=51;
else if(name.compareTo("FADD")==0) command1.comId=55;
else if(name.compareTo("FSUM")==0) command1.comId=56;
else if(name.compareTo("FMUL")==0) command1.comId=57;
else if(name.compareTo("FDIV")==0) command1.comId=58;
else if(name.compareTo("FMOV")==0) command1.comId=59;
else if(name.compareTo("FRDW")==0) command1.comId=60;
else if(name.compareTo("FWRW")==0) command1.comId=61;
else if(name.compareTo("MFC")==0) command1.comId=62;
else if(name.compareTo("MCF")==0) command1.comId=63;
else if(name.compareTo("ADDS")==0) command1.comId=64;
else if(name.compareTo("SUBS")==0) command1.comId=65;
else if(name.compareTo("MULS")==0) command1.comId=66;
else if(name.compareTo("DIVS")==0) command1.comId=67;
else if(name.compareTo("ADDSI")==0) command1.comId=68;
else if(name.compareTo("SUBSI")==0) command1.comId=69;
else if(name.compareTo("MULSI")==0) command1.comId=70;
else if(name.compareTo("DIVSI")==0) command1.comId=71;
else if(name.compareTo("MOVF")==0) command1.comId=72;
else if(name.compareTo("MOVSI")==0) command1.comId=73;
else System.err.println("command " + name + " doesn't support");
if(this.equals(conv1)) {
as.setCommandDecodedA(command1.comId);
as.setCommandIdDecodingBlockA(command1.counter);
}
else {
as.setCommandDecodedB(command1.comId);
as.setCommandIdDecodingBlockB(command1.counter);
}
if(command2==null) command2=command1;
else System.err.println("Conveier error in block decoder");
command1=null;
}
void blockViboraOperandov() {
if(command2==null) {
if(this.equals(conv1)) {
as.setOper1A(-1);
as.setOper2A(-1);
as.setCommandIdOperandsBlockA(-1);
}
else {
as.setOper1B(-1);
as.setOper2B(-1);
as.setCommandIdOperandsBlockB(-1);
}
return;
}
StringTokenizer st = new StringTokenizer(command2.command, " ");
if(st.countTokens()>1)
{
st.nextToken();
StringTokenizer operands = new StringTokenizer(st.nextToken(),
",");
command2.operNum=operands.countTokens();
for(int i=0;i<command2.operNum;i++)
{
command2.strOper[i] = operands.nextToken();
//преобразование из строки
if((command2.strOper[i].charAt(0)>='0'&&command2.strOper[i].charAt(0)<='9')||command2.strOper[i].charAt(0)=='-')
command2.oper[i] = Integer.parseInt(command2.strOper[i]);
else
{
if(command2.strOper[i].charAt(0) == 'R') command2.oper[
i] = R[command2.regNum[i] = Integer.parseInt(command2.strOper[i].
substring(1, command2.strOper[i].length()))];
else if(command2.strOper[i].charAt(0) == 'F') command2.
oper[i] = F[command2.regNum[i] = Integer.parseInt(command2.strOper[
i].substring(1, command2.strOper[i].length()))];
else System.err.println("непонятный операнд " +
command2.strOper[i]);
}
}

}
else command2.operNum=0;
if(this.equals(conv1)) {
as.setOper1A((float)command2.oper[0]);
as.setOper2A((float)command2.oper[1]);
as.setCommandIdOperandsBlockA(command2.counter);
}
else {
as.setOper1B((float)command2.oper[0]);
as.setOper2B((float)command2.oper[1]);
as.setCommandIdOperandsBlockB(command2.counter);
}

if(conveierControl(this))
{
if (command3 == null) command3 = command2;
else System.err.println("Conveier error in block decoder");
command2 = null;
}
}
void blockALU() {
double temp;
long c=1;
if (command3 == null) {
if(this.equals(conv1)) {
as.setResaultA("");
as.setCommandIdExecutionBlockA(-1);
}
else {
as.setResaultB("");
as.setCommandIdExecutionBlockB(-1);
}
return;
}
switch (command3.comId) {
case 0:
R[command3.regNum[0]] = (long)memDefine((int) (R[command3.regNum[1]] + command3.oper[2]), 2);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 1:
R[command3.regNum[0]] = (long)memDefine((int) (R[command3.regNum[1]] + command3.oper[2]), 4);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 2:
R[command3.regNum[0]] = (long)memDefine((int) (R[command3.regNum[1]] + command3.oper[2]), 8);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 3:
memWrite((int) (R[command3.regNum[1]] + command3.oper[2]), (long)command3.oper[0],2);
command3.result = String.valueOf((long)command3.oper[0]);
break;
case 4:
memWrite((int) (R[command3.regNum[1]] + command3.oper[2]), (long)command3.oper[0],4);
command3.result = String.valueOf((long)command3.oper[0]);
break;
case 5:
memWrite((int) (R[command3.regNum[1]] + command3.oper[2]), (long)command3.oper[0],8);
command3.result = String.valueOf((long)command3.oper[0]);
break;
case 8: //XCHG
temp = (double)R[command3.regNum[0]];
R[command3.regNum[0]] = R[command3.regNum[1]];
R[command3.regNum[1]] = (long)temp;
command3.result = String.valueOf(R[command3.regNum[0]])+" "+String.valueOf(R[command3.regNum[1]]);
break;
case 9: //MOVI
R[command3.regNum[0]] = (int)command3.oper[1];
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 12: //ADD
if((R[command3.regNum[1]] + R[command3.regNum[2]])<R[command3.regNum[0]]) flags = (char)((int)flags|16);
else flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] + R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 13: //SUB
if((R[command3.regNum[1]] - R[command3.regNum[2]])>R[command3.regNum[0]]) flags = (char)((int)flags|16);
else flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] - R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 14: //MUL
if(((long)R[command3.regNum[1]] * (long)R[command3.regNum[2]])>=(c<<32)) flags = (char)((int)flags|16);
else flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] * R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 15: //DIV
flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] / R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 16: //ADDI
if((R[command3.regNum[1]] + (int)command3.oper[2])<R[command3.regNum[0]]) flags = (char)((int)flags|16);
else flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] + (int)command3.oper[2];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 17: //SUBI
if((R[command3.regNum[1]] - (int)command3.oper[2])>R[command3.regNum[0]]) flags = (char)((int)flags|16);
else flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] - (int)command3.oper[2];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 18: //MULI
if(((long)R[command3.regNum[1]] * (long)command3.oper[2])>=(c<<32)) flags = (char)((int)flags|16);
else flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] * (int)command3.oper[2];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 19: //DIVI
flags = (char)((int)flags&239);
//переполнение
R[command3.regNum[0]] = R[command3.regNum[1]] / (int)command3.oper[2];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 20: //AND
R[command3.regNum[0]] = R[command3.regNum[1]]&R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 21: //OR
R[command3.regNum[0]] = R[command3.regNum[1]]|R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 22: //XOR
R[command3.regNum[0]] = R[command3.regNum[1]]^R[command3.regNum[2]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 23: //NOT
R[command3.regNum[0]] = ~R[command3.regNum[1]];
if(R[command3.regNum[0]]==0) flags = (char)((int)flags|64);
else flags = (char)((int)flags&191);
if(R[command3.regNum[0]]<0) flags = (char)((int)flags|32);
else flags = (char)((int)flags&223);
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 24: //RCL
R[command3.regNum[0]] = R[command3.regNum[0]]<<(int)command3.oper[1];
// flags C S
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 25: //RCR
R[command3.regNum[0]] = R[command3.regNum[0]]>>(int)command3.oper[1];
// flags C S
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 26: //CLI
flags&=251;
break;
case 27: //STI
flags|=4;
break;
case 28: //INT
break;
case 29: //IRET
break;
case 30: //CALL
break;
case 31: //RET
break;
case 32:
PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 33:
if((flags&64)>0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 34:
if((flags&64)==0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 35:
if((flags&8)>0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 36:
if((flags&8)==0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 37:
if((flags&32)>0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 38:
if((flags&32)==0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 39:
if((flags&16)>0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 40:
if((flags&16)==0) PC=(int)command3.oper[0]+(int)command3.oper[1]-1;
break;
case 41: //RFL
R[command3.regNum[0]] = flags;
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 42: //WFL
flags = (char)(R[command3.regNum[0]]&255);
break;
case 43: //RTLBR
R[command3.regNum[0]] = TLBP;
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 44: //WTLBR
if((flags&1)==0) command3.result = "access denied";
else {
TLBP = R[command3.regNum[0]];
command3.result = String.valueOf(TLBP);
}
break;
case 45: //RISR
R[command3.regNum[0]] = TINT;
command3.result = String.valueOf(R[command3.regNum[0]]);
break;
case 46: //WISR
if((flags&1)==0) command3.result = "access denied";
else {
TINT = R[command3.regNum[0]];
command3.result = String.valueOf(TINT);
}
break;
case 47: //RFE
flags&=254;
break;
case 48: //SCALL
flags|=1;
break;
case 49: //HALT
break;
case 50: //NOP
break;
case 51: //RBVA
R[command3.regNum[0]] = BVA;
command3.result = String.valueOf(R[command3.regNum[0]]);
break;


case 55: //FADD
F[command3.regNum[0]] = F[command3.regNum[1]] + F[command3.regNum[2]];
if(F[command3.regNum[0]]==0) fflags = (char)((int)fflags|2);
else fflags = (char)((int)fflags&253);
if(F[command3.regNum[0]]<0) fflags = (char)((int)fflags|1);
else fflags = (char)((int)fflags&254);
command3.result = String.valueOf(F[command3.regNum[0]]);
break;
case 56: //FSUB
F[command3.regNum[0]] = F[command3.regNum[1]] - F[command3.regNum[2]];
if(F[command3.regNum[0]]==0) fflags = (char)((int)fflags|2);
else fflags = (char)((int)fflags&253);
if(F[command3.regNum[0]]<0) fflags = (char)((int)fflags|1);
else fflags = (char)((int)fflags&254);
command3.result = String.valueOf(F[command3.regNum[0]]);
break;
case 57: //FMUL
F[command3.regNum[0]] = F[command3.regNum[1]] * F[command3.regNum[2]];
if(F[command3.regNum[0]]==0) fflags = (char)((int)fflags|2);
else fflags = (char)((int)fflags&253);
if(F[command3.regNum[0]]<0) fflags = (char)((int)fflags|1);
else fflags = (char)((int)fflags&254);
command3.result = String.valueOf(F[command3.regNum[0]]);
break;
case 58: //FDIV
F[command3.regNum[0]] = F[command3.regNum[1]] / F[command3.regNum[2]];
if(F[command3.regNum[0]]==0) fflags = (char)((int)fflags|2);
else fflags = (char)((int)fflags&253);
if(F[command3.regNum[0]]<0) fflags = (char)((int)fflags|1);
else fflags = (char)((int)fflags&254);
command3.result = String.valueOf(F[command3.regNum[0]]);
break;
case 59: //FMOV
temp = F[command3.regNum[0]];
F[command3.regNum[0]] = F[command3.regNum[1]];
F[command3.regNum[1]] = temp;
command3.result = String.valueOf(F[command3.regNum[0]])+" "+String.valueOf(F[command3.regNum[1]]);
break;
case 60: //FRDW
break;
case 61: //FWRW
break;
case 62: //MFC
break;
case 63: //MCF
F[command3.regNum[1]] = R[command3.regNum[0]];
if(F[command3.regNum[1]]==0) fflags = (char)((int)fflags|2);
else fflags = (char)((int)fflags&253);
if(F[command3.regNum[1]]<0) fflags = (char)((int)fflags|1);
else fflags = (char)((int)fflags&254);
break;
default:
System.err.println("команда " + command3.command +
"пока не поддерживается");
break;
}
if (this.equals(conv1)) {
as.setResaultA(command3.result);
as.setCommandIdExecutionBlockA(command3.counter);
} else {
as.setResaultB(command3.result);
as.setCommandIdExecutionBlockB(command3.counter);
}
if (command4 == null) command4 = command3;
else System.err.println("Conveier error in block decoder");
command3 = null;
}
void blockVozvrata() {
if(command4==null) {
if(this.equals(conv1)) {
as.setComCounterA(-1);
as.setCommandIdReturnBlockA(-1);
}
else {
as.setComCounterB(-1);
as.setCommandIdReturnBlockB(-1);
}
return;
}
PC++;
for(int i=0;i<3;i++) {
if(command4.strOper[i]!=null&&command4.strOper[i].charAt(0)=='R')
md.setRegister(command4.strOper[i],R[command4.regNum[i]]);
if(command4.strOper[i]!=null&&command4.strOper[i].charAt(0)=='F')
md.setFloatRegister(command4.strOper[i],F[command4.regNum[i]]);
}
md.setFlags(flags);
md.setSoprocessorFlags(fflags);
md.setTLB(TLBP);
md.setINT(TINT);
md.commandLt.setSelectedIndex((int)PC);
md.setPC(PC);
conveierResume(this);
if (this.equals(conv1)) {
as.setComCounterA(PC);
as.setCommandIdReturnBlockA(command4.counter);
} else {
as.setComCounterB(PC);
as.setCommandIdReturnBlockB(command4.counter);
}
command4 = null;
}
}


}



Соседние файлы в папке architecture