📄 microins.cpp
字号:
Full=0;
}
void MicroIns::Push(int a)
{
if(Full==1)
{
uStack[uSP]=a;
}
else
{
uSP++;
if(uSP==4)Full=1;
uStack[uSP]=a;
}
}
int MicroIns::GetTop()
{
if(uSP==-1)return 0;
return uStack[uSP];
}
int MicroIns::Pop()
{
if(uSP==-1)return 0;
int Temp=uStack[uSP];
if(uSP==4)Full=0;
uSP--;
return Temp;
}
void MicroIns::getADDR()
{
if(MicroIR[18]==1)
{
MicroIR[30]=IR[5];
MicroIR[31]=IR[6];
MicroIR[32]=IR[7];
MicroIR[33]=IR[8];
}
if(MicroIR[22]==1)
{
MicroIR[26]=IR[1];
MicroIR[27]=IR[2];
MicroIR[28]=IR[3];
MicroIR[29]=IR[4];
}
if(IR[9]!=-1)
d=IR[9];
// cout<<"ADDR:"<<d<<endl;
}
void MicroIns::SetDwithMIR()
{
D=MicroIR[1];
}
void MicroIns::SetuIinSCCi()
{
uI3=MicroIR[2];
uI2=MicroIR[3];
uI1=MicroIR[4];
uI0=MicroIR[5];
SCC3=MicroIR[6];
SCC2=MicroIR[7];
SCC1=MicroIR[8];
SCC0=MicroIR[9];
// cout<<"UI3-uI0:"<<uI3<<uI2<<uI1<<uI0<<endl;
// cout<<"SCC:"<<SCC3<<SCC2<<SCC1<<SCC0<<endl;
}
void MicroIns::setAm2901(Am2901 *m)
{
m->clean();
if(d!=-1)
{
m->getD(d);
// cout<<"D:"<<d<<endl;
}
int a[40];
for(int i=0;i<40;i++)
{
a[i]=MicroIR[10+i];
}
char b[41];
for(i=0;i<40;i++)
b[i]=(char)(a[i]+48);
b[40]='\0';
// cout<<b<<endl;
// char *p=b;
m->getStack(b,41);
// for(i=0;i<40;i++)
// cout<<m->stack[i]<<' ';
// cout<<endl;
m->getReg(R,16);
m->getA();
m->getB();
m->getflages0(flages0);
m->getSCI();
m->getI2_I0();
m->getI5_I3();
m->getSST();
m->getI8_I6();
for(i=0;i<16;i++)
{
R[i]=m->RR[i];
}
flages=m->flages;
// cout<<"flages:"<<flages<<endl;
}
void MicroIns::SetCC()
{
int Temp=IR[0];
switch(8*SCC3+4*SCC2+2*SCC1+SCC0)
{
case 0:CC=0;break;
case 2:CC=1;break;
case 4:
if((Temp==0x44)&&(C==0))CC=0;
if((Temp==0x44)&&(C==1))CC=1,uPC=0x2f;
if((Temp==0x45)&&(C==0))CC=1,uPC=0x2f;
if((Temp==0x45)&&(C==1))CC=0;
if((Temp==0x46)&&(Z==0))CC=0;
if((Temp==0x46)&&(Z==1))CC=1,uPC=0x2f;
if((Temp==0x47)&&(Z==0))CC=1;
if((Temp==0x47)&&(Z==1))CC=0,uPC=0x2f;
break;
case 5:
if((Temp==0x64)&&(S==0))CC=0;
if((Temp==0x64)&&(S==1))CC=1,uPC=0x2f;
if((Temp==0x65)&&(S==0))CC=1;
if((Temp==0x65)&&(S==1))CC=0,uPC=0x2f;
break;
case 6:
if(Temp&2)CC=1;
else CC=0;
break;
case 7:
if(Temp&1)CC=0;
else CC=1;
break;
}
// cout<<"CC:"<<CC<<endl;
}
void MicroIns::getR(int *a,int k)
{
for(int i=0;i<k;i++)
R[i]=a[i];
}
void MicroIns::getupc()
{
int x;
x=IR[0];
for(int i=0;i<20;i++)
{
if(x==MicroAddr[i][0])
{
uPC=MicroAddr[i][1];
// cout<<"uPC:"<<uPC<<endl;
}
}
}
void MicroIns::getD()
{
D=getd();
}
void MicroIns::getRC()
{
RC=MicroIR[1];
RC=RC+1;
}
void MicroIns::AM2910()
{
int a=8*uI3+4*uI2+2*uI1+uI0;
// cout<<a<<endl;
if(CC==1)
{
switch(8*uI3+4*uI2+2*uI1+uI0)
{
case 0:
SetDwithMIR();
Y=0;
ClearStack();
break;
case 1:
SetDwithMIR();
Y=uPC+1;
break;
case 2:
getD();
Y=D;
break;
case 3:
SetDwithMIR();
Y=uPC+1;
break;
case 4:
SetDwithMIR();
Y=uPC+1;
Push(uPC+1);
getRC();
break;
case 5:
SetDwithMIR();
Y=RC;
Push(uPC+1);
break;
case 6:
Y=uPC+1;
break;
case 7:
SetDwithMIR();
Y=RC;
break;
case 8:
SetDwithMIR();
if(RC!=0)
{
Y=GetTop();
RC--;
}
if(RC==0)
{
Y=uPC+1;
Pop();
}
break;
case 9:
SetDwithMIR();
if(RC!=0)
{
Y=uPC;
RC--;
}
if(RC==0)Y=uPC+1;
break;
case 10:
SetDwithMIR();
Y=uPC+1;
break;
case 11:
SetDwithMIR();
Y=uPC+1;
break;
case 12:
SetDwithMIR();
getRC();
Y=uPC+1;
RC=D;
break;
case 13:
SetDwithMIR();
Y=GetTop();
break;
case 14:
SetDwithMIR();
Y=uPC+1;
break;
case 15:
SetDwithMIR();
if(RC!=0)
{
Y=GetTop();
RC--;
}
if(RC==0)
{
Y=D;
Pop();
}
break;
}
}
if(CC==0)
{
switch(8*uI3+4*uI2+2*uI1+uI0)
{
case 0:
SetDwithMIR();
Y=0;
ClearStack();
break;
case 1:
SetDwithMIR();
Y=D;
Push(uPC+1);
break;
case 2:
getD();
Y=D;
break;
case 3:
SetDwithMIR();
Y=D;
break;
case 4:
SetDwithMIR();
getRC();
Y=uPC+1;
Push(uPC+1);
break;
case 5:
SetDwithMIR();
Y=D;
Push(uPC+1);
break;
case 6:
Y=D;
break;
case 7:
SetDwithMIR();
Y=D;
break;
case 8:
SetDwithMIR();
if(RC!=0)
{
Y=GetTop();
RC--;
}
if(RC==0)
{
Y=uPC+1;
Pop();
}
break;
case 9:
SetDwithMIR();
if(RC!=0)
{
Y=D;
RC--;
}
if(RC==0)Y=uPC+1;
break;
case 10:
SetDwithMIR();
Y=Pop();
break;
case 11:
SetDwithMIR();
Y=D;
Pop();
break;
case 12:
SetDwithMIR();
getRC();
Y=uPC+1;
RC=D;
break;
case 13:
SetDwithMIR();
Y=uPC+1;
Pop();
break;
case 14:
SetDwithMIR();
Y=uPC+1;
break;
case 15:
SetDwithMIR();
if(RC!=0)
{
Y=uPC+1;
Pop();
RC--;
}
if(RC==0)
{
Y=uPC+1;
Pop();
}
break;
}
}
uPC=Y;
// cout<<"upc:"<<uPC<<endl;
// cout<<"RC:"<<RC<<endl;
}
void MicroIns::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;
// cout<<"CZVS:"<<C<<' '<<Z<<' '<<V<<' '<<S<<endl;
}
int MicroIns::HexToDec(char a)
{
int x=-1;
if(a=='0')
x=0;
if(a=='1')
x=1;
if(a=='2')
x=2;
if(a=='3')
x=3;
if(a=='4')
x=4;
if(a=='5')
x=5;
if(a=='6')
x=6;
if(a=='7')
x=7;
if(a=='8')
x=8;
if(a=='9')
x=9;
if(a=='a'||a=='A')
x=10;
if(a=='b'||a=='B')
x=11;
if(a=='c'||a=='C')
x=12;
if(a=='d'||a=='D')
x=13;
if(a=='e'||a=='E')
x=14;
if(a=='f'||a=='F')
x=15;
return x;
}
void MicroIns::Exec(WORD *Rtemp,WORD instype,WORD flags,WORD *pmemory)
{
// AfxMessageBox("hello");
memory=pmemory;
for(int i=0;i<16;i++)
{
R[i]=Rtemp[i];
}
Getflages0(flags);
int x=R[5];
int temp=0;
int a[10];
temp=memory[x]&0xff00;
temp=temp/(0x100);
a[0]=temp;
a[9]=-1;
if(instype==41||instype==42||instype==6)
{
a[9]=memory[x+1];
temp=memory[x]&0x00f0;
temp=temp/(0x10);
if(temp==0)
a[1]=0,a[2]=0,a[3]=0,a[4]=0;
if(temp==1)
a[1]=0,a[2]=0,a[3]=0,a[4]=1;
if(temp==2)
a[1]=0,a[2]=0,a[3]=1,a[4]=0;
if(temp==3)
a[1]=0,a[2]=0,a[3]=1,a[4]=1;
if(temp==4)
a[1]=0,a[2]=1,a[3]=0,a[4]=0;
if(temp==5)
a[1]=0,a[2]=1,a[3]=0,a[4]=1;
if(temp==6)
a[1]=0,a[2]=1,a[3]=1,a[4]=0;
if(temp==7)
a[1]=0,a[2]=1,a[3]=1,a[4]=1;
if(temp==8)
a[1]=1,a[2]=0,a[3]=0,a[4]=0;
if(temp==9)
a[1]=1,a[2]=0,a[3]=0,a[4]=1;
if(temp==10)
a[1]=1,a[2]=0,a[3]=1,a[4]=0;
if(temp==11)
a[1]=1,a[2]=0,a[3]=1,a[4]=1;
if(temp==12)
a[1]=1,a[2]=1,a[3]=0,a[4]=0;
if(temp==13)
a[1]=1,a[2]=1,a[3]=0,a[4]=1;
if(temp==14)
a[1]=0,a[2]=1,a[3]=1,a[4]=0;
if(temp==15)
a[1]=1,a[2]=1,a[3]=1,a[4]=1;
temp=memory[x]&0x000f;
if(temp==0)
a[5]=0,a[6]=0,a[7]=0,a[8]=0;
if(temp==1)
a[5]=0,a[6]=0,a[7]=0,a[8]=1;
if(temp==2)
a[5]=0,a[6]=0,a[7]=1,a[8]=0;
if(temp==3)
a[5]=0,a[6]=0,a[7]=1,a[8]=1;
if(temp==4)
a[5]=0,a[6]=1,a[7]=0,a[8]=0;
if(temp==5)
a[5]=0,a[6]=1,a[7]=0,a[8]=1;
if(temp==6)
a[5]=0,a[6]=1,a[7]=1,a[8]=0;
if(temp==7)
a[5]=0,a[6]=1,a[7]=1,a[8]=1;
if(temp==8)
a[5]=1,a[6]=0,a[7]=0,a[8]=0;
if(temp==9)
a[5]=1,a[6]=0,a[7]=0,a[8]=1;
if(temp==10)
a[5]=1,a[6]=0,a[7]=1,a[8]=0;
if(temp==11)
a[5]=1,a[6]=0,a[7]=1,a[8]=1;
if(temp==12)
a[5]=1,a[6]=1,a[7]=0,a[8]=0;
if(temp==13)
a[5]=1,a[6]=1,a[7]=0,a[8]=1;
if(temp==14)
a[5]=0,a[6]=1,a[7]=1,a[8]=0;
if(temp==15)
a[5]=1,a[6]=1,a[7]=1,a[8]=1;
}
if(instype==5)
{
a[9]=memory[x]&0x00ff;
for(int i=1;i<9;i++)
a[i]=0;
}
if(instype==1||instype==22||instype==23||instype==21||instype==3)
{
temp=memory[x]&0x00f0;
temp=temp/(0x10);
if(temp==0)
a[1]=0,a[2]=0,a[3]=0,a[4]=0;
if(temp==1)
a[1]=0,a[2]=0,a[3]=0,a[4]=1;
if(temp==2)
a[1]=0,a[2]=0,a[3]=1,a[4]=0;
if(temp==3)
a[1]=0,a[2]=0,a[3]=1,a[4]=1;
if(temp==4)
a[1]=0,a[2]=1,a[3]=0,a[4]=0;
if(temp==5)
a[1]=0,a[2]=1,a[3]=0,a[4]=1;
if(temp==6)
a[1]=0,a[2]=1,a[3]=1,a[4]=0;
if(temp==7)
a[1]=0,a[2]=1,a[3]=1,a[4]=1;
if(temp==8)
a[1]=1,a[2]=0,a[3]=0,a[4]=0;
if(temp==9)
a[1]=1,a[2]=0,a[3]=0,a[4]=1;
if(temp==10)
a[1]=1,a[2]=0,a[3]=1,a[4]=0;
if(temp==11)
a[1]=1,a[2]=0,a[3]=1,a[4]=1;
if(temp==12)
a[1]=1,a[2]=1,a[3]=0,a[4]=0;
if(temp==13)
a[1]=1,a[2]=1,a[3]=0,a[4]=1;
if(temp==14)
a[1]=0,a[2]=1,a[3]=1,a[4]=0;
if(temp==15)
a[1]=1,a[2]=1,a[3]=1,a[4]=1;
temp=memory[x]&0x000f;
if(temp==0)
a[5]=0,a[6]=0,a[7]=0,a[8]=0;
if(temp==1)
a[5]=0,a[6]=0,a[7]=0,a[8]=1;
if(temp==2)
a[5]=0,a[6]=0,a[7]=1,a[8]=0;
if(temp==3)
a[5]=0,a[6]=0,a[7]=1,a[8]=1;
if(temp==4)
a[5]=0,a[6]=1,a[7]=0,a[8]=0;
if(temp==5)
a[5]=0,a[6]=1,a[7]=0,a[8]=1;
if(temp==6)
a[5]=0,a[6]=1,a[7]=1,a[8]=0;
if(temp==7)
a[5]=0,a[6]=1,a[7]=1,a[8]=1;
if(temp==8)
a[5]=1,a[6]=0,a[7]=0,a[8]=0;
if(temp==9)
a[5]=1,a[6]=0,a[7]=0,a[8]=1;
if(temp==10)
a[5]=1,a[6]=0,a[7]=1,a[8]=0;
if(temp==11)
a[5]=1,a[6]=0,a[7]=1,a[8]=1;
if(temp==12)
a[5]=1,a[6]=1,a[7]=0,a[8]=0;
if(temp==13)
a[5]=1,a[6]=1,a[7]=0,a[8]=1;
if(temp==14)
a[5]=0,a[6]=1,a[7]=1,a[8]=0;
if(temp==15)
a[5]=1,a[6]=1,a[7]=1,a[8]=1;
a[9]=-1;
}
/* CString temp2,temp1;
for(i=0;i<10;i++){
temp2.Format("%d",a[i]);
temp1+=temp2;
}
AfxMessageBox(temp1);*/
getIR(a);
Read();
Do();
R[5]++;
}
void MicroIns::Read()
{
char buffer[200];
GetCurrentDirectory(200,buffer);
CString temp1="\\MicroIns.txt";
char buffer1[20];
strcpy(buffer1,temp1);
strcat(buffer,buffer1);
ifstream in_file(buffer,ios::in);
if(!in_file) exit(-1);
char buf[20][69];
int temp=0;
while(in_file.eof()==0)
{
in_file.getline(buf[temp],70,'\n');
buf[temp][68]='\0';
temp++;
}
// for(int j=0;j<temp;j++)
// cout<<buf[j]<<endl;
int *a[20];
for(int i=0;i<temp;i++)
{
a[i]=new int[2];
char x0,y0;
int x1,y1;
x0=buf[i][0];
y0=buf[i][1];
x1=HexToDec(x0);
y1=HexToDec(y0);
a[i][0]=x1*16+y1;
x0=buf[i][3];
y0=buf[i][4];
x1=HexToDec(x0);
y1=HexToDec(y0);
a[i][1]=x1*16+y1;
}
int *b[20];
for(i=0;i<temp;i++)
{
b[i]=new int[50];
char x0,y0;
int x1,y1;
x0=buf[i][3];
y0=buf[i][4];
x1=HexToDec(x0);
y1=HexToDec(y0);
b[i][0]=x1*16+y1;
x0=buf[i][6];
y0=buf[i][7];
x1=HexToDec(x0);
y1=HexToDec(y0);
b[i][1]=x1*16+y1;
int m0=2;
for(int m=8;m<68;m++)
{
char y2;
int x2;
y2=buf[i][m];
if(y2!=' '&&m0<50)
{
x2=HexToDec(y2);
b[i][m0]=x2;
m0++;
}
}
}
/* for(i=0;i<temp;i++)
for(int j=0;j<2;j++)
cout<<a[i][j]<<' ';
cout<<endl;
for(i=0;i<temp;i++)
for(int j=0;j<50;j++)
cout<<b[i][j]<<' ';
cout<<endl;*/
getMicroAddr(temp,a);
getMicroP(temp,b);
}
void MicroIns::Do()
{
Read();
getCZVS();
getupc();
// cout<<"uPC:"<<uPC<<endl;
for(int i=0;i<50;i++)
{
if(uPC!=48&&uPC!=00)
{
getMicroIR();
Am2901 m;
SetuIinSCCi();
getADDR();
SetCC();
//cout<<"flages0:"<<flages<<endl;
AM2910();
setAm2901(&m);
//cout<<"uPC:"<<uPC<<endl;
//cout<<"flages1:"<<flages<<endl;
}
//cout<<"flages2:"<<flages<<endl;
}
}
/*
void main()
{
int x;
cout<<"flages:";
cin>>x;
int c[16];
for(int i=0;i<16;i++)
c[i]=0;
c[0]=0x1234,c[1]=23,c[2]=43;
cout<<"put IR:";
MicroIns a;
a.getflages0(x);
a.getR(c,16);
int b[10];
for(i=0;i<10;i++)
cin>>b[i];
a.getIR(b);
a.Do();
for(i=0;i<5;i++)
{
for(int j=0;j<2;j++)
cout<<a.MicroAddr[i][j]<<' ';
cout<<endl;
}
for(i=0;i<5;i++){
for(int j=0;j<50;j++){
cout<<a.MicroP[i][j]<<' ';
}
cout<<endl;
}
for(i=0;i<16;i++)
cout<<a.R[i]<<' ';
cout<<endl;
cout<<"flages:"<<a.ReturnFlages()<<endl;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -