📄 simu.cpp
字号:
#include "stdafx.h"
#include "TEC2000.h"
#include "MicroProDlg.h"
#include <iostream>
#include "simu.h"
using namespace std;
//以下为数据转化部分
COffSimu::COffSimu()
{
int i;
for(i=0;i<3;i++)
{
I8_6[i]=0;
I5_3[i]=0;
I2_0[i]=0;
SST2_0[i]=0;
}
for(i=0;i<2;i++)
{
SCI1_0[i]=0;
SSH1_0[i]=0;
}
for(i=0;i<16;i++)
{
Q[i]=0;
for(int j=0;j<16;j++)
r[i][j]=0;
}
for(i=0;i<4;i++)
{
A[i]=0;
B[i]=0;
flag[i]=0;
temflag[i]=0;
}
}
void COffSimu::Dec2Bin(int dec)
{
//int x[17];
int i;//存放每次运算后的余数
for(i=0;i<17;i++)
x[i]=0;
int j=16;
do{
i=dec%2;
x[j]=i;
j--;
dec=dec/2;
}while(dec!=0);
//return x;
}
int COffSimu::Bin2Dec(int bin[],int n)//二进制化为十进制(二进制为int型数组)
{
int x=1;
int y=0,z=0;
for(int i=1;i<n;i++)
{
x=2*x;
}
for(int j=0;j<n;j++)
{
y=bin[j]*x;
z+=y;
x=x/2;
}
return z;
}
//以下为运算部分
void COffSimu::ADD(int R[],int S[])
{
int r,s;
//int *p;
//int x=Bin2Dec(B,4);//B口地址换算成十进制
r=Bin2Dec(R,16);
s=Bin2Dec(S,16);
r=r+s+Cin;
Dec2Bin(r);
if(x[0]==1)
temflag[0]=1;//进位
if(x[1]==1)
temflag[3]=1;//符号位
if(x[1]==0)
temflag[3]=0;
for(int i=0;i<16;i++)
F[i]=x[i+1];
}
void COffSimu::srSUB(int R[],int S[])
{
int i,y[16];
for(i=0;i<16;i++)
y[i]=(R[i]+1)%2;
int k=0,k1;
F[15]=y[15]+S[15]+1-(1-Cin);
if(F[15]>=2)
{
F[15]=F[15]-2;
k=1;
}
for(i=14;i>=0;i--)
{
k1=k;
F[i]=y[i]+S[i]+k;
if(F[i]>=2)
{
F[i]=F[i]-2;
k=1;
}
else
k=0;
if(i==11)
C0=k1;
}
if(k==1)
{
temflag[0]=0;
if(k1==1)
temflag[2]=0;
else temflag[2]=1;
}
else
{
temflag[0]=1;
temflag[2]=0;
}
if(F[0]==1)
temflag[3]=1;
int sum=0;
for(i=0;i<16;i++) sum+=F[i];
if(sum==0)
temflag[1]=1;
}
void COffSimu::rsSUB(int R[],int S[])
{
int i,k,k2,s[16];
for(i=0;i<16;i++) s[i]=(S[i]+1)%2;
k=0;
F[15]=s[15]+R[15]+1-(1-Cin);
if(F[15]>=2){ F[15]=F[15]-2;k=1;}
for(i=14;i>=0;i--)
{
k2=k;
F[i]=s[i]+R[i]+k;
if(F[i]>=2) { F[i]=F[i]-2;k=1;}
else k=0;
if(i==11) C0=k2;
}
if(k==1) {temflag[0]=0;
if(k2==1) temflag[2]=0;
else temflag[2]=1;}
else {temflag[0]=1;temflag[2]=0;}
if(F[0]==1) temflag[3]=1;
int sum=0;
for(i=0;i<16;i++) sum+=F[i];
if(sum==0) temflag[1]=1;
}
void COffSimu::OR(int R[],int S[])
{
//int x=Bin2Dec(B,4);//B口地址换算成十进制
for(int i=0;i<16;i++)
{
if(R[i]==0&&S[i]==0)
F[i]=0;
else
F[i]=1;
}
if(F[0]==1)
temflag[3]=1;
}
void COffSimu::AND(int R[],int S[])
{
//int x=Bin2Dec(B,4);//B口地址换算成十进制
for(int i=0;i<16;i++)
{
if(R[i]==1&&S[i]==1)
F[i]=1;
else
F[i]=0;
}
if(F[0]==1)
temflag[3]=1;
}
void COffSimu::XOR(int R[],int S[])
{
//int x=Bin2Dec(B,4);//B口地址换算成十进制
for(int i=0;i<16;i++)
{
if(R[i]==S[i])
F[i]=0;
else
F[i]=1;
}
if(F[0]==1)
temflag[3]=1;
}
void COffSimu::NRAND(int R[],int S[])
{
//int x=Bin2Dec(B,4);//B口地址换算成十进制
for(int i=0;i<16;i++)
{
if(R[i]==0)
R[i]=1;
else
R[i]=0;
}
for(i=0;i<16;i++)
{
if(R[i]==1&&S[i]==1)
F[i]=1;
else
F[i]=0;
}
if(F[0]==1)
temflag[3]=1;
}
void COffSimu::NXOR(int R[],int S[])
{
//int x=Bin2Dec(B,4);//B口地址换算成十进制
for(int i=0;i<16;i++)
{
if(R[i]==S[i])
F[i]=1;
else
F[i]=0;
}
if(F[0]==1)
temflag[3]=1;
}
//以下是控制码部分
void COffSimu::OpRA()
{
int x=Bin2Dec(A,4);//A口地址换算成十进制
for(int i=0;i<16;i++)
tem1[i]=r[x][i];
}
void COffSimu::OpRB()
{
int x=Bin2Dec(B,4);//B口地址换算成十进制
for(int i=0;i<16;i++)
tem2[i]=r[x][i];
}
void COffSimu::OpI2_0()//分析I2_0字段,将来源数据放入R[],S[]
{
int x=Bin2Dec(I2_0,3);
int i;
switch(x)
{
case 0:
for(i=0;i<16;i++)
{
R[i]=tem1[i];
S[i]=Q[i];
}
break;
case 1:
for(i=0;i<16;i++)
{
R[i]=tem1[i];
S[i]=tem2[i];
}
break;
case 2:
for(i=0;i<16;i++)
{
R[i]=0;
S[i]=Q[i];
}
break;
case 3:
for(i=0;i<16;i++)
{
R[i]=0;
S[i]=tem2[i];
}
break;
case 4:
for(i=0;i<16;i++)
{
R[i]=0;
S[i]=tem1[i];
}
break;
case 5:
for(i=0;i<16;i++)
{
R[i]=D[i];
S[i]=tem1[i];
}
break;
case 6:
for(i=0;i<16;i++)
{
R[i]=D[i];
S[i]=Q[i];
}
break;
case 7:
for(i=0;i<16;i++)
{
R[i]=D[i];
S[i]=0;
}
break;
}
}
void COffSimu::OpI5_3()//分析I5_3字段,执行相应操作
{
int x=Bin2Dec(I5_3,3);
switch(x)
{
case 0:
ADD(R,S);
break;
case 1:
srSUB(R,S);
break;
case 2:
rsSUB(R,S);
break;
case 3:
OR(R,S);
break;
case 4:
AND(R,S);
break;
case 5:
XOR(R,S);
break;
case 6:
NRAND(R,S);
break;
case 7:
NXOR(R,S);
break;
}
}
void COffSimu::OpI8_6()//分析I8_6字段,处理运算结果
{
int x=Bin2Dec(I8_6,3);
int y=Bin2Dec(B,4);//B口地址换算成十进制
int z=Bin2Dec(A,4);//A口地址换算成十进制
int i;
switch(x)
{
case 0:
for(i=0;i<16;i++)
{
Q2[i]=F[i];
Y[i]=F[i];
}
break;
case 1:
for(i=0;i<16;i++)
{
Y[i]=F[i];
}
break;
case 2:
for(i=0;i<16;i++)
{
r2[y][i]=F[i];
Y[i]=tem1[i];
}
break;
case 3:
for(i=0;i<16;i++)
{
r2[y][i]=F[i];
Y[i]=F[i];
}
break;
case 4:
for(i=0;i<16;i++)
{
r2[y][i+1]=F[i];
Q2[i+1]=Q[i];
Y[i]=F[i];
}
RShift();
break;
case 5:
for(i=0;i<16;i++)
{
r2[y][i+1]=F[i];
Y[i]=F[i];
}
RShift();
break;
case 6:
for(i=0;i<16;i++)
{
r2[y][i]=F[i+1];
Q2[i]=Q[i+1];
Y[i]=F[i];
}
LShift();
break;
case 7:
for(i=0;i<16;i++)
{
r2[y][i]=F[i+1];
Y[i]=F[i];
}
LShift();
break;
}
}
void COffSimu::OpSST2_0()//分析SST2_0字段,执行相应操作
{
int x,y;
int i;
x=Bin2Dec(SST2_0,3);
y=Bin2Dec(B,4);
switch(x)
{
case 0:
break;
case 1:
for(i=0;i<4;i++)
flag[i]=temflag[i];
break;
case 2:
for(i=0;i<4;i++)
flag[i]=0;
break;
case 3:
flag[0]=0;
break;
case 4:
flag[0]=1;
break;
case 5:
flag[0]=r2[y][0];
break;
case 6:
flag[0]=r2[y][15];
break;
case 7:
flag[0]=Q[0];
break;
}
}
void COffSimu::LShift()//分析SSH1_0字段,执行相应操作
{
int x,y;
x=Bin2Dec(SSH1_0,2);
y=Bin2Dec(B,4);
switch(x)
{
case 0:
r2[y][15]=0;
break;
case 1:
r2[y][15]=flag[0];
break;
case 2:
r2[y][15]=Q[15];
Q[15]=F[15];
case 3:
break;
}
}
void COffSimu::RShift()
{
int x,y;
x=Bin2Dec(SSH1_0,2);
y=Bin2Dec(B,4);
switch(x)
{
case 0:
r2[y][0]=0;
break;
case 1:
r2[y][0]=flag[0];
break;
case 2:
r2[y][0]=flag[0];
Q[0]=r2[y][0];
case 3:
r2[y][0]=F[15];
Q[0]=r2[y][0];
break;
}
}
void COffSimu::OpSCI1_0()//分析SCI1_0字段,执行相应操作
{
int x;
x=Bin2Dec(SCI1_0,2);
switch(x)
{
case 0:
Cin=0;
break;
case 1:
Cin=1;
break;
case 2:
Cin=flag[0];
break;
case 3:
Cin=C0;
break;
}
}
void COffSimu::DoOperation()
{
OpRA();//A地址内容放入tem1[16]
OpRB();//B地址内容放入tem2[16]
OpI2_0();//来源数据放入R[16],S[16]
OpSCI1_0();//最低位进位处理
OpI5_3();//运算
OpI8_6();//存储
}
void COffSimu::Start()
{
int x=Bin2Dec(B,4);
for(int i=0;i<16;i++)
{
Q[i]=Q2[i];
r[x][i]=r2[x][i];
}
DoOperation();
OpSST2_0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -