📄 microins.cpp
字号:
#include "stdafx.h"
#include "MicroIns.h"
#include <iostream.h>
#include <string.h>
#include<fstream.h>
#include<stdlib.h>
//int flages; //标志位
void Am2901::clean()
{
R=0,S=0;
A=0,B=0;
D=0,F=0;
temp=0;
flages=0x0;
}
int Am2901::IC(int p)
{
int x=0,y=0;
int z=1;
for(int i=0;i<16;i++)
{
y=p&z;
z=z*2;
if(y!=0)
x=z/2;
}
return x;
}
int Am2901::QuFan(int p)
{
int a[16];
int i=15;
int x=p;
while(i>=0)
{
a[i]=x%2;
x=x/2;
i--;
}
for(int j=0;j<16;j++)
{
if(a[j]==0)
a[j]=1;
else
a[j]=0;
}
int y=0;
int n=1;
for(j=0;j<16;j++)
{
y=y+a[15-j]*n;
n=n*2;
}
return y;
}
void Am2901::getI2_I0()
{
char a[5];
for(int i=0;i<4;i++)
a[i]=stack[4+i];
a[4]='\0';
char *p=a;
// cout<<"I2-I0:"<<p<<endl;
if(strcmp(p,"0000")==0)
R=A,S=Q;
if(strcmp(p,"0001")==0)
R=A,S=B;
if(strcmp(p,"0010")==0)
R=0,S=Q;
if(strcmp(p,"0011")==0)
R=0,S=B;
if(strcmp(p,"0100")==0)
R=0,S=A;
if(strcmp(p,"0101")==0)
R=D,S=A;
if(strcmp(p,"0110")==0)
R=D,S=Q;
if(strcmp(p,"0111")==0)
R=D,S=0;
// cout<<"D:"<<D<<endl;
// cout<<"R:"<<R<<' '<<"S:"<<S<<endl;
}
void Am2901::getReg(int *a,int k)
{
for(int i=0;i<k;i++)
{
RR[i]=a[i];
// cout<<RR[i]<<' ';
}
// cout<<endl;
}
void Am2901::ShiftLeft()
{
char a[3];
for(int i=0;i<2;i++)
a[i]=stack[28+i];
a[2]='\0';
char *p=a;
// cout<<"SSH:"<<p<<endl;
if(strcmp(p,"00")==0)
{
temp=temp*2;
int m=0x10000;
temp=temp%m;
}
if(strcmp(p,"01")==0)
{
int x=flages0;
if((x&8)!=0)
c=1;
else c=0;
temp=temp*2;
temp=temp+c;
int m=0x10000;
temp=temp%m;
}
if(strcmp(p,"10")==0)
{
int m,n,k;
k=0x10000;
n=temp;
m=0x8000;
temp=temp*2;
temp=temp%k;
if(Q&m)
{
temp=temp+1;
}
Q=Q*2;
Q=Q%k;
if(n&m)
{
Q=Q+1;
}
}
}
void Am2901::ShiftRight()
{
char a[3];
for(int i=0;i<2;i++)
a[i]=stack[28+i];
a[2]='\0';
char *p=a;
//cout<<a<<endl;
if(strcmp(p,"00")==0)
{
//cout<<"hello:"<<endl;
if(temp%2)
{
temp=temp-1;
temp=temp/2;
}
else
temp=temp/2;
}
if(strcmp(p,"01")==0)
{
int m=flages0;
if((m&8)!=0)
c=1;
else c=0;
if(temp%2)
{
temp=temp-1;
temp=temp/2;
}
else
temp=temp/2;
if(c==1)
temp=temp+0x8000;
}
if(strcmp(p,"10")==0)
{
int m,k;
k=temp;
m=flages0;
c=m&0x8;
int n;
n=0x8000;
if(temp%2)
temp=(temp-1)/2;
else
temp=temp/2;
if(c==1)
temp=temp+0x8000;
if(Q%2)
Q=(Q-1)/2;
else
Q=Q/2;
if(k&0x8000)
Q=Q+0x8000;
}
if(strcmp(p,"11")==0)
{
int m;
m=temp;
if(temp%2)
temp=(temp-1)/2;
else
temp=temp/2;
if(m&0x8000)
temp=temp+0x8000;
if(Q%2)
Q=(Q-1)/2;
else
Q=Q/2;
if(m%2)
Q=Q+0x8000;
}
}
int Am2901::getSA()
{
char p;
p=stack[8];
// cout<<"SA:"<<p<<endl;
return p;
}
int Am2901::getSB()
{
char p=stack[12];
// cout<<"SB:"<<p<<endl;
return p;
}
void Am2901::getA()
{
char x;
x=getSA();
// cout<<"SA:"<<x<<endl;
if(x=='1')
{
int a[4];
for(int i=0;i<4;i++)
a[i]=stack[20+i]-48;
// cout<<"a[i]:";
// for(i=0;i<4;i++)
// cout<<a[i]<<' ';
// cout<<endl;
int m=0;
int n=1;
for(i=3;i>=0;i--)
{
m=m+a[i]*n;
n=n*2;
}
// cout<<"m:"<<m<<endl;
A=RR[m];
}
else
{
int a[4];
for(int i=0;i<4;i++)
a[i]=stack[20+i]-48;
int x=0;
x=a[0]*8+a[1]*4+a[2]*2+a[3];
if(x==5)
{
A=RR[5];
}
}
// cout<<"A:"<<A<<endl;
}
void Am2901::getB()
{
char x;
x=getSB();
// cout<<"x:"<<x<<endl;
if(x=='1')
{
int a[4];
for(int i=0;i<4;i++)
a[i]=stack[16+i]-48;
int m=0;
int n=1;
for(i=3;i>=0;i--)
{
m=m+a[i]*n;
n=n*2;
}
// cout<<"m:"<<m<<endl;
B=RR[m];
}
else
{
int a[4];
for(int i=0;i<4;i++)
a[i]=stack[16+i]-48;
int x=0;
x=a[0]*8+a[1]*4+a[2]*2+a[3];
if(x==5)
{
B=RR[5];
}
}
// cout<<"B:"<<B<<endl;
}
int Am2901::Return()
{
int a[4];
for(int i=0;i<4;i++)
a[i]=stack[16+i]-48;
int m=0;
int n=1;
for(i=3;i>=0;i--)
{
m=m+a[i]*n;
n=n*2;
}
return m;
}
void Am2901::getI8_I6()
{
int x=Return();
// cout<<"X:"<<x<<endl;
char a[4];
for(int i=0;i<3;i++)
a[i]=stack[9+i];
a[3]='\0';
char *p=a;
// cout<<"I8-I6:"<<p<<endl;
if(strcmp(p,"000")==0)
Q=temp,F=temp;
if(strcmp(p,"001")==0)
F=temp;
if(strcmp(p,"010")==0)
{
B=temp,F=A;
if(x>=0)
RR[x]=B;
}
if(strcmp(p,"011")==0)
{
B=temp,F=temp;
if(x>=0)
RR[x]=B;
}
if(strcmp(p,"100")==0)
{
ShiftRight(),F=temp;
B=temp;
if(x>=0)
RR[x]=B;
}
if(strcmp(p,"101")==0)
{
ShiftRight(),F=temp;
B=temp;
if(x>=0)
RR[x]=B;
}
if(strcmp(p,"110")==0)
{
ShiftLeft(),F=temp;
B=temp;
if(x>=0)
RR[x]=B;
}
if(strcmp(p,"111")==0)
{
ShiftLeft(),F=temp;
B=temp;
if(x>=0)
RR[x]=B;
}
// cout<<"F:"<<F<<' '<<"B:"<<B<<"Q:"<<Q<<endl;
}
void Am2901::getI5_I3()
{
char a[4];
for(int i=0;i<3;i++)
a[i]=stack[13+i];
a[3]='\0';
char *p=a;
// cout<<"I5-I3:"<<p<<endl;
if(strcmp(p,"000")==0)
{
temp=R+S+Cin;
int x,y,z;
x=IC(R);
y=IC(S);
z=IC(temp);
if(x>=y)
{
if(x==z)
flages&=0x7;
else flages|=0x8;
}
else
{
if(y==z)
flages&=0x7;
else flages|=0x8;
}
if(temp==0)
flages|=0x4;
else flages&=0xb;
if(temp&0x10000)
{
flages|=0x2;
int x=0x10000;
temp=temp%x;
}
else flages&=0xd;
if(temp<0)
flages|=0x1;
else flages&=0xe;
}
if(strcmp(p,"001")==0)
{
temp=S-R-(!Cin);
//cout<<~Cin<<endl;
//cout<<"hello"<<endl;
//cout<<temp<<endl;
//cout<<S<<' '<<R<<endl;
if(S<R)
flages&=0x7;
else
{
int x,y;
x=IC(S);
y=IC(R);
if(x==y)
{
if(S>=R)
flages|=0x8;
else flages&=0x7;
}
else
{
int X=S;
X=X-x;
if(X>=R)
flages|=0x8;
else flages&=0x7;
}
}
if(temp==0)
flages|=0x4;
else flages&=0xb;
flages&=0xd;
if(S<R)
flages|=0x1;
else flages&=0xe;
// cout<<"flages:"<<flages<<endl;
}
if(strcmp(p,"010")==0)
{
temp=R-S-(!Cin);
int x,y;
x=IC(R);
y=IC(S);
if(R<S)
flages&=0x7;
else
{
if(x==y)
{
if(R>=S)
flages&=0x7;
else flages|=0x8;
}
else
{
int X=R;
X=X-x;
if(X>=S)
flages&=0x7;
else flages|=0x8;
}
}
if(temp==0)
flages|=0x4;
else flages&=0xb;
flages&=0xd;
if(R<S)
flages|=0x1;
else flages=0xe;
}
if(strcmp(p,"011")==0)
{
temp=R|S;
flages=0x0;
if(temp==0)
flages|=0x4;
else flages&=0xb;
}
if(strcmp(p,"100")==0)
{
temp=R&S;
flages=0x0;
if(temp==0)
flages|=0x4;
else flages&=0xb;
}
if(strcmp(p,"101")==0)
{
int x;
x=R&S;
temp=QuFan(x);
flages=0x0;
if(temp==0)
flages|=0x4;
else flages&=0xb;
}
if(strcmp(p,"110")==0)
{
temp=R^S;
flages=0x0;
if(temp==0)
flages|=0x4;
else flages&=0xb;
}
if(strcmp(p,"111")==0)
{
int x;
x=R^S;
temp=QuFan(x);
flages=0x0;
if(temp==0)
flages|=0x4;
else flages&=0xb;
}
// cout<<"temp:"<<temp<<endl;
}
void Am2901::getSST()
{
char a[5];
for(int i=0;i<4;i++)
a[i]=stack[24+i];
a[4]='\0';
char *p=a;
// cout<<"SST:"<<p<<endl;
if(strcmp(p,"0000")==0)
getCZVS();
if(strcmp(p,"0001")==0)
{
if(flages&8)
c=1;
else c=0;
if(flages&4)
z=1;
else z=0;
if(flages&2)
v=1;
else v=0;
if(flages&1)
s=1;
else s=0;
}
if(strcmp(p,"0011")==0)
{
getCZVS();
c=0;
}
if(strcmp(p,"0100")==0)
{
getCZVS();
c=1;
}
if(strcmp(p,"0101")==0)
{
getCZVS();
int x=temp;
int y=1;
x=x&y;
c=x;
cout<<"C:"<<c<<endl;
}
if(strcmp(p,"0110")==0)
{
getCZVS();
int x=temp;
int y=0x8000;
x=x&y;
c=x;
}
if(strcmp(p,"0111")==0)
{
getCZVS();
int x=Q;
int y=1;
x=x&y;
c=x;
}
flages=0;
if(c==1)
flages|=8;
if(z==1)
flages|=4;
if(v==1)
flages|=2;
if(s==1)
flages|=1;
// cout<<"hello"<<flages<<endl;
}
void Am2901::getSCI()
{
char a[3];
a[0]=stack[30];
a[1]=stack[31];
a[2]='\0';
char *p=a;
// cout<<"SCI:"<<p<<endl;
getCZVS();
if(strcmp(p,"00")==0)
{
Cin=0;
}
if(strcmp(p,"01")==0)
{
Cin=1;
}
if(strcmp(p,"10")==0)
{
Cin=c;
}
// cout<<"Cin:"<<Cin<<endl;
}
void Am2901::getCZVS()
{
if(flages0&8)
c=1;
else c=0;
if(flages0&4)
z=1;
else z=0;
if(flages0&2)
v=1;
else v=0;
if(flages0&1)
s=1;
else s=0;
}
void Am2901::getStack(char *p,int count)
{
for(int i=0;i<count;i++)
this->stack[i]=p[i];
}
MicroIns::MicroIns()
{
// MicroP=new int [5][50];
// MicroAddr=new int[2];
IR=new int[10];
for(int j=0;j<10;j++)
IR[j]=0;
IR[9]=-1;
IR=new int [10];
RC=uPC=uSP=0;
uStack=new int[5];
for(int i=0;i<5;i++)uStack[i]=0;
d=-1;
flages0=0;
flages=0;
MicroIR=new int [50];
C=0,Z=0,V=0,S=0;
uI3=uI2=uI1=uI0=0;
SCC3=SCC2=SCC1=SCC0=0;
Full=0;
}
MicroIns::~MicroIns()
{
delete uStack;
delete MicroIR;
delete IR;
}
void MicroIns::getIR(int *a)
{
for(int i=0;i<10;i++)
IR[i]=a[i];
// for( i=0;i<10;i++)
// cout<<IR[i];
// cout<<endl;
}
void MicroIns::Getflages0(WORD flag)
{
int x=0;
if(flag&0x8000)
x=x+8;
if(flag&0x4000)
x=x+4;
if(flag&0x2000)
x=x+2;
if(flag&0x1000)
x=x+1;
flages0=x;
}
void MicroIns::getMicroIR()
{
for(int i=0;i<20;i++)
{
if(uPC==MicroP[i][0])
{
for(int j=0;j<50;j++)
MicroIR[j]=MicroP[i][j];
}
}
// for(i=0;i<50;i++)
// cout<<MicroIR[i]<<' ';
// cout<<endl;
}
void MicroIns::getMicroP(int argc,int * argv[]) //argc表示参数个数,即微指令个数,argv[]表示各个参数的指针
{
for(int i=0;i<20;i++)
MicroP[i]=new int[50];
for(i=0;i<argc;i++)
{
for(int j=0;j<50;j++)
MicroP[i][j]=argv[i][j];
}
for(i=argc;i<20;i++)
for(int j=0;j<50;j++)
MicroP[i][j]=-1;
}
void MicroIns::getMicroAddr(int argc,int * argv[])
{
for(int i=0;i<20;i++)
MicroAddr[i]=new int[2];
for(i=0;i<argc;i++)
{
for(int j=0;j<2;j++)
MicroAddr[i][j]=argv[i][j];
}
for(i=argc;i<20;i++)
for(int j=0;j<2;j++)
MicroAddr[i][j]=-1;
}
void MicroIns::ClearStack()
{
uSP=-1;
for(int i=0;i<5;i++)uStack[i]=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -