📄 kernel.java
字号:
public class kernel{
private int k;
private int _sci; //binary value
private int RAM0; //binary value
private int RAM15; //binary value
private int Q0; //binary value
private int CY; //binary value
private int flags[]; //flag registers with sequence of CZVS
private int R; //value
private int S; //value
private int Q; //value
private int A; //index
private int B; //index
private int F; //value
private int f[]; //binary value
private int Registers[]; //value
private int DATA; //value
private int I8;
private int I7;
private int I6;
private int I5;
private int I4;
private int I3;
private int I2;
private int I1;
private int I0;
private int sst[];
private int addrA[];
private int addrB[];
private int sci[];
private int ssh[];
public kernel(){
flags = new int[4];
Registers = new int[16];
f = new int[16];
sst = new int[3];
addrA = new int[4];
addrB = new int[4];
sci = new int[2];
ssh = new int[2];
clearAll();
}
public void clearAll(){
for(k=0;k<16;k++){
f[k]=0;
Registers[k]=0;
if(k<2){
sci[k]=0;
ssh[k]=0;
}
if(k<3){
sst[k]=0;
}
if(k<4){
flags[k]=0;
addrA[k]=0;
addrB[k]=0;
}
}
CY = 0;
RAM0 = 0;
RAM15 = 0;
Q0 = 0;
_sci = 0;
R = 0;
S = 0;
Q = 0;
A = 0;
B = 0;
F = 0;
DATA = 0;
I8 = 0;
I7 = 0;
I6 = 0;
I5 = 0;
I4 = 0;
I3 = 0;
I2 = 0;
I1 = 0;
I0 = 0;
}
public void clearRegistersAndFlags(){
for(k=0;k<16;k++){
f[k]=0;
Registers[k]=0;
if(k<3){
sst[k]=0;
}
if(k<4){
flags[k]=0;
}
}
CY = 0;
RAM0 = 0;
RAM15 = 0;
Q0 = 0;
R = 0;
S = 0;
Q = 0;
A = 0;
B = 0;
F = 0;
}
public int fabs(int operand){
if(operand>=0){
return operand;
}
else{
return (-1)*operand;
}
}
public int[] getFlags(){
return flags;
}
public int setFlags(int FF){
if(sst[0]==0&&sst[1]==0&&sst[2]==0){
return FF;
}
else if(sst[0]==0&&sst[1]==0&&sst[2]==1){
for(k=0;k<4;k++){
flags[k] = 0;
}
if(FF == 0){
flags[1] = 1;
}
else if(FF < 0){
flags[3] = 1;
}
else if(fabs(FF)>65535){
flags[0] = 1;
return fabs(FF) - 65536;
}
else if(FF<-32768){
flags[2] = 1;
return FF;
}
else if(FF>32767){
flags[2] = 1;
return FF;
}
}
else if(sst[0]==0&&sst[1]==1&&sst[2]==1){
flags[0] = 0;
}
else if(sst[0]==1&&sst[1]==0&&sst[2]==0){
flags[0] = 1;
}
else if(sst[0]==1&&sst[1]==0&&sst[2]==1){
flags[0] = RAM0;
}
else if(sst[0]==1&&sst[1]==1&&sst[2]==0){
flags[0] = RAM15;
}
else if(sst[0]==1&&sst[1]==1&&sst[2]==1){
flags[0] = Q0;
}
return FF;
}
public int[] setFlags(int[] binary){
return convertToBinary_16bits(setFlags(convertToDecimal_16bits(binary)));
}
public int convertToDecimal_4bits(int[] binary){
int result = 0;
for(k=0;k<4;k++){
if(binary[k]==1){
result+=Math.pow(2,3-k);
}
}
return result;
}
public int convertToDecimal_16bits(int[] binary){
int result = 0;
int[] temp = new int[16];
for(k=0;k<16;k++){
temp[k] = binary[k];
}
boolean negative = false;
if(temp[0]==1){
temp = twosComplement(temp);
negative = true;
}
for(k=0;k<16;k++){
if(temp[k]==1){
result+=Math.pow(2,15-k);
}
}
if(negative){
result=result*(-1);
}
return result;
}
public int[] convertToBinary_16bits(int decimal){
int[] result = new int[16];
boolean negative = false;
if(decimal<0){
negative = true;
decimal = decimal*(-1);
}
for(k=15;k>=0;k--){
result[k]=decimal%2;
decimal=decimal/2;
}
if(negative){
result = twosComplement(result);
}
return result;
}
public void specifyMI(int[] mi_l,int[] mi_r){
I8=mi_l[0];
I7=mi_l[1];
I6=mi_l[2];
I5=mi_l[3];
I4=mi_l[4];
I3=mi_l[5];
I2=mi_l[6];
I1=mi_l[7];
I0=mi_l[8];
sst[0]=mi_l[9];
sst[1]=mi_l[10];
sst[2]=mi_l[11];
addrA[0]=mi_r[0];
addrA[1]=mi_r[1];
addrA[2]=mi_r[2];
addrA[3]=mi_r[3];
addrB[0]=mi_r[4];
addrB[1]=mi_r[5];
addrB[2]=mi_r[6];
addrB[3]=mi_r[7];
A = convertToDecimal_4bits(addrA);
B = convertToDecimal_4bits(addrB);
sci[0]=mi_r[8];
sci[1]=mi_r[9];
ssh[0]=mi_r[10];
ssh[1]=mi_r[11];
}
public void specifyData(int[] receiver){
DATA = 0;
DATA = convertToDecimal_16bits(receiver);
}
public void chooseRS(){
if(I2==0&&I1==0&&I0==0){
R = Registers[A];
S = Q;
}
else if(I2==0&&I1==0&&I0==1){
R = Registers[A];
S = Registers[B];
}
else if(I2==0&&I1==1&&I0==0){
R = 0;
S = Q;
}
else if(I2==0&&I1==1&&I0==1){
R = 0;
S = Registers[B];
}
else if(I2==1&&I1==0&&I0==0){
R = 0;
S = Registers[A];
}
else if(I2==1&&I1==0&&I0==1){
R = DATA;
S = Registers[A];
}
else if(I2==1&&I1==1&&I0==0){
R = DATA;
S = Q;
}
else if(I2==1&&I1==1&&I0==1){
R = DATA;
S = 0;
}
}
public int chooseOperation(){
if(I5==0&&I4==0&&I3==0){
return 0;
}
else if(I5==0&&I4==0&&I3==1){
return 1;
}
else if(I5==0&&I4==1&&I3==0){
return 2;
}
else if(I5==0&&I4==1&&I3==1){
return 3;
}
else if(I5==1&&I4==0&&I3==0){
return 4;
}
else if(I5==1&&I4==0&&I3==1){
return 5;
}
else if(I5==1&&I4==1&&I3==0){
return 6;
}
else if(I5==1&&I4==1&&I3==1){
return 7;
}
return 0;
}
public int chooseResultFormat(){
if(I8==0&&I7==0&&I6==0){
return 0;
}
else if(I8==0&&I7==0&&I6==1){
return 1;
}
else if(I8==0&&I7==1&&I6==0){
return 2;
}
else if(I8==0&&I7==1&&I6==1){
return 3;
}
else if(I8==1&&I7==0&&I6==0){
return 4;
}
else if(I8==1&&I7==0&&I6==1){
return 5;
}
else if(I8==1&&I7==1&&I6==0){
return 6;
}
else if(I8==1&&I7==1&&I6==1){
return 7;
}
return 0;
}
public int chooseSCI(int current_value){
if(sci[0]==0&&sci[1]==0){
return 0;
}
else if(sci[0]==0&&sci[1]==1){
return 1;
}
else if(sci[0]==1&&sci[1]==0){
return flags[0];
}
else if(sci[0]==1&&sci[1]==1){
return 1-current_value;
}
return 0;
}
public int[] calculate(){
_sci = chooseSCI(_sci);
RAM0 = f[15];
RAM15 = f[0];
Q0 = convertToBinary_16bits(Q)[15];
chooseRS();
//calculate on R and S
switch(chooseOperation()){
case 0: F = R + S + _sci;
f = convertToBinary_16bits(F);
break;
case 1: F = S - R - _sci;
f = convertToBinary_16bits(F);
break;
case 2: F = R - S - _sci;
f = convertToBinary_16bits(F);
break;
case 3: f = or(convertToBinary_16bits(R),convertToBinary_16bits(S));
break;
case 4: f = and(convertToBinary_16bits(R),convertToBinary_16bits(S));
break;
case 5: f = and(not(convertToBinary_16bits(R)),convertToBinary_16bits(S));
break;
case 6: f = xor(convertToBinary_16bits(R),convertToBinary_16bits(S));
break;
case 7: f = nxor(convertToBinary_16bits(R),convertToBinary_16bits(S));
break;
}
if(fabs(F)>65535){
F = fabs(F) - 65536;
CY = 1;
}
F = convertToDecimal_16bits(f);
switch(chooseResultFormat()){
case 2:
return convertToBinary_16bits(Registers[A]);
default:
return f;
}
}
//shift bits & output result
public void storeResult(){
f = setFlags(f);
switch(chooseResultFormat()){
case 0: Q = F;
break;
case 1: break;
case 2: Registers[B] = F;
break;
case 3: Registers[B] = F;
break;
case 4: Registers[B] = rightShift(f,rightShiftControl_1());
Q = rightShift(convertToBinary_16bits(Q),rightShiftControl_2());
break;
case 5: Registers[B] = rightShift(f,rightShiftControl_1());
break;
case 6: Registers[B] = leftShift(f,leftShiftControl_1());
Q = leftShift(convertToBinary_16bits(Q),leftShiftControl_2());
break;
case 7: Registers[B] = leftShift(f,leftShiftControl_1());
break;
}
}
//methods below are intended to deal with 16 bits binary numbers
public int rightShiftControl_1(){
if(ssh[0]==0&&ssh[1]==0){
return 0;
}
else if(ssh[0]==0&&ssh[1]==1){
return flags[0];
}
else if(ssh[0]==1&&ssh[1]==0){
return CY;
}
else if(ssh[0]==1&&ssh[1]==1){
return (f[0]!=flags[2])?1:0;
}
return 0;
}
public int rightShiftControl_2(){
if(ssh[0]==0&&ssh[1]==0){
return -1;
}
else if(ssh[0]==0&&ssh[1]==1){
return -1;
}
else if(ssh[0]==1&&ssh[1]==0){
return f[15];
}
else if(ssh[0]==1&&ssh[1]==1){
return f[15];
}
return 0;
}
public int leftShiftControl_1(){
if(ssh[0]==0&&ssh[1]==0){
return 0;
}
else if(ssh[0]==0&&ssh[1]==1){
return flags[0];
}
else if(ssh[0]==1&&ssh[1]==0){
return convertToBinary_16bits(Q)[0];
}
else if(ssh[0]==1&&ssh[1]==1){
return -1;
}
return 0;
}
public int leftShiftControl_2(){
if(ssh[0]==0&&ssh[1]==0){
return -1;
}
else if(ssh[0]==0&&ssh[1]==1){
return -1;
}
else if(ssh[0]==1&&ssh[1]==0){
return f[0];
}
else if(ssh[0]==1&&ssh[1]==1){
return -1;
}
return 0;
}
public int rightShift(int[] operands,int shiftInto){
int temp;
temp = operands[15];
for(k=15;k>0;k--){
operands[k] = operands[k-1];
}
if(shiftInto<0){
operands[0] = temp;
}
else{
operands[0] = shiftInto;
}
return convertToDecimal_16bits(operands);
}
public int leftShift(int[] operands,int shiftInto){
int temp;
temp = operands[0];
for(k=0;k<15;k++){
operands[k] = operands[k+1];
}
if(shiftInto<0){
operands[15] = temp;
}
else{
operands[15] = shiftInto;
}
return convertToDecimal_16bits(operands);
}
public int[] not(int[] operand){
for(k=0;k<16;k++){
operand[k]=1-operand[k];
}
return operand;
}
public int[] or(int[] operand1,int[] operand2){
int[] result = new int[16];
for(k=0;k<16;k++){
if((operand1[k]==1) || (operand2[k]==1)){
result[k]=1;
}
else{
result[k]=0;
}
}
return result;
}
public int[] and(int[] operand1,int[] operand2){
int[] result = new int[16];
for(k=0;k<16;k++){
if((operand1[k]==1) && (operand2[k]==1)){
result[k]=1;
}
else{
result[k]=0;
}
}
return result;
}
public int[] xor(int[] operand1,int[] operand2){
int[] result = new int[16];
for(k=0;k<16;k++){
if(operand1[k]==operand2[k]){
result[k]=0;
}
else{
result[k]=1;
}
}
return result;
}
public int[] nxor(int[] operand1,int[] operand2){
int[] result = new int[16];
for(k=0;k<16;k++){
if(operand1[k]==operand2[k]){
result[k]=1;
}
else{
result[k]=0;
}
}
return result;
}
public int[] twosComplement(int[] operand){
boolean whether_keep = true;
for(k=15;k>=0;k--){
if(whether_keep){
if(operand[k]==1){
whether_keep = false;
}
continue;
}
operand[k]=1-operand[k];
}
return operand;
}
//end
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -