out3/0016079_3.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int HtD(char n) //十六進位轉十進位
{
if(n>='0' && n<='9')
return n - '0' ;
else
return n - 'A' + 10 ;
}
void DecToHex(int n,int Hex[]) //0~255換十六進位
{
Hex[0] = n / 16;
Hex[1] = n % 16;
Hex[2] = 0;
}
void DtB(int n , char Bin[]) //0~15轉二進位
{
for(int i=0 ; i<4 ; i++)
{
Bin[3-i] = n%2 + '0';
n /= 2;
}
Bin[4] = 0;
}
int CtD(char a[]) //字元陣列換十進位
{
int dec = 0;
for(int i=0 ; a[i]!='\0' ; i++)
dec = dec*10 + ( a[i]-'0' );
return dec;
}
void ToUpper(char s[]) //字元轉換成大寫
{
for(int i=0 ; s[i]!='\0' ; i++)
if(s[i]>='a' && s[i]<='z')
s[i] -= 32 ;
}
void Error(char s[])
{
cout << "Error: " << s << endl;
exit(0);
}
int main()
{
char org[1024] = {0}; //輸入陣列
while(gets(org))
{
char orgrs[1024] = {0}; //去除開頭空白
char L[1024] = {0}; //指令
char R[1024] = {0}; //指令位址
char Rrs[1024] = {0};
char RL[1024] = {0};
char RR[1024] = {0};
char RJ[1024] = {0};
char XY[1024] = {0}; //輸入之XY
int xy;//0~255之XY位址
int hex [3] = {0};
char bin2[5] = {0};
char bin3[5] = {0};
char bin4[5] = {0};
bool cut;
int i,j,k;
for(i=0,j=0 ; org[i]!=';' && org[i]!='\0' && org[i]!='\n' && org[i]!=13 ; i++) //去除開頭空白
if( !( j==0 && (org[i]==' ' || org[i]=='\t') ) )
orgrs[j++] = org[i];
orgrs[j] = 0;
//if(org[i] != ';')
// Error(org);
ToUpper(orgrs);
//cout << orgrs << endl;
for(i=0,j=0,cut=0 ; orgrs[i]!='\0';i++) //截取指令
if(cut==0)
if(orgrs[i]!=' ' && orgrs[i]!='\t')
L[i] = orgrs[i]; //指令
else
{
cut=1;
L[i] = 0;
}
else
R[j++] = orgrs[i]; //指令位址
R[j] = 0;
//cout<<"R="<<R<<endl;
for(i=0,j=0 ; R[i]!=';' && R[i]!='\0' ; i++) //R→Rrs
if( !( j==0 && (R[i]==' ' || R[i]=='\t') ) )
Rrs[j++] = R[i];
Rrs[j] = 0;
for(i=0,j=0,cut=0 ; Rrs[i]!='\0';i++) //Rrs分成RL和RR
if(cut==0)
if(Rrs[i]!=',')
{
RL[i] = Rrs[i]; //暫存器位址
RJ[i] = Rrs[i];
}
else
{
cut=1;
RL[i] = Rrs[i];
RL[i+1] = 0;
RJ[i] = 0;
}
else
RR[j++] = Rrs[i]; //指令位址
RR[j] = 0;
//cout<<"RL="<<RL<<endl;
//cout<<"RR="<<RR<<endl;
//cout<<"RJ="<<RJ<<endl;
for(i=0,j=0 ; RL[i]!='\0' ; i++) //RL陣列去空白
if(RL[i] == ' ' || RL[i] == '\t')
continue;
else
RL[j++] = RL[i];
RL[j] = 0; //結尾
//cout<<"RL="<<RL<<endl;
for(i=0,j=0 ; RR[i]!=';' && RR[i]!='\0' ; i++) //RR去除開頭空白
if( !( j==0 && (RR[i]==' ' || RR[i]=='\t') ) )
RR[j++] = RR[i];
RR[j] = 0;
//cout<<"RR="<<RR<<endl;
for(i=0,j=0 ; R[i]!='\0' ; i++) //R陣列去空白
if(R[i] == ' ' || R[i] == '\t')
continue;
else
R[j++] = R[i];
R[j] = 0; //結尾
//cout<<"R="<<R<<endl;
if( !strcmp(L,"LOAD") )
{
//cout <<L<<" : "<<R<<endl;
if ( RL[0]=='R' && ( (RL[1]>='0' && RL[1]<='9') || (RL[1]>='A' && RL[1]<='F') ) &&
RL[2]==',' )
{
if(RR[0]=='[') //1RXY
{
for(i=1,j=1 ; RR[i]!=';' && RR[i]!='\0' ; i++) //RR去除'['後開頭空白
if( !( j==1 && (RR[i]==' ' || RR[i]=='\t') ) )
RR[j++] = RR[i];
RR[j] = 0;
//for(i=0 ; RR[i]!=0 ; i++)
// cout<<"RR["<<i<<"] = "<<RR[i]<<endl;
for(i=1,j=0 ; ( RR[i]!=' ' && RR[i]!='\t' && RR[i]!=']' && RR[i]!='\0' ) ; i++)
if( RR[i]>='0' && RR[i]<='9' )
XY[j++] = RR[i];
else
break;
XY[j] = 0;
//cout<<"XY="<<XY<<endl;
//cout<<"i="<<i<<endl;
k=i;
while( !(RR[k]==']' || RR[k]=='\0') )
if(RR[k]==' ' || RR[k]=='\t')
k++;
else
Error(org);
//cout<<"k="<<k<<endl;
xy = CtD(XY);
for(i=0,j=0 ; ( RR[i]!='\0' && RR[i]!=';' ) ; i++) //RR陣列去空白
if(RR[i] == ' ' || RR[i] == '\t')
continue;
else
RR[j++] = RR[i];
RR[j] = 0; //結尾
//cout<<RR<<endl;
for(i=0 ; !(RR[i]==']' || RR[i]=='\0') ; i++)
continue;
if( RR[i]==']' && RR[i+1]=='\0' && xy<256 )
{
DtB( HtD(RL[1]) ,bin2);
DecToHex(xy,hex);
DtB(hex[0],bin3);
DtB(hex[1],bin4);
cout << "0001" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else if(RR[0]>='0' && RR[0]<='9') //2RXY
{
for(i=0,j=0 ; ( RR[i]!=' ' && RR[i]!='\t' && RR[i]!='\0' ) ; i++)
if( RR[i]>='0' && RR[i]<='9' )
XY[j++] = RR[i];
else
break;
XY[j] = 0;
k=i;
while(RR[k]!='\0')
if(RR[k]==' ' || RR[k]=='\t')
k++;
else
Error(org);
xy = CtD(XY);
for(i=0,j=0 ; ( RR[i]!='\0' && RR[i]!=';' ) ; i++) //RR陣列去空白
if(RR[i] == ' ' || RR[i] == '\t')
continue;
else
RR[j++] = RR[i];
RR[j] = 0;
for(i=0 ; RR[i]!='\0'; i++)
continue;
if( RR[i]=='\0' && xy<256 )
{
DtB( HtD(RL[1]) ,bin2);
DecToHex(xy,hex);
DtB(hex[0],bin3);
DtB(hex[1],bin4);
cout << "0010" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else
Error(org);
}
else
Error(org);
}
else if( !strcmp(L,"STORE") ) //3RXY
{
for(i=1,j=1 ; RR[i]!=';' && RR[i]!='\0' ; i++) //RR去除'['後開頭空白
if( !( j==1 && (RR[i]==' ' || RR[i]=='\t') ) )
RR[j++] = RR[i];
RR[j] = 0;
if ( RL[0]=='R' && ( (RL[1]>='0' && RL[1]<='9') || (RL[1]>='A' && RL[1]<='F') ) &&
RL[2]==',' && RR[0]=='[' )
{
for(i=1,j=0 ; ( RR[i]!=' ' && RR[i]!='\t' && RR[i]!=']' && RR[i]!='\0' ) ; i++)
if( RR[i]>='0' && RR[i]<='9' )
XY[j++] = RR[i];
else
break;
XY[j] = 0;
k=i;
while( !(RR[k]==']' || RR[k]=='\0') )
if(RR[k]==' ' || RR[k]=='\t')
k++;
else
Error(org);
for(i=4,j=0 ; ( R[i]!=']' && R[i]!='\0' ) ; i++)
if( R[i]>='0' && R[i]<='9' )
XY[j++] = R[i];
else
Error(org);
xy = CtD(XY);
if( R[i]==']' && R[i+1]=='\0' && xy<256 )
{
DtB( HtD(RL[1]) ,bin2);
DecToHex(xy,hex);
DtB(hex[0],bin3);
DtB(hex[1],bin4);
cout << "0011" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else
Error(org);
}
else if( !strcmp(L,"MOVE") ) //40RS
{
if( R[0]=='R' && ( (R[1]>='0' && R[1]<='9') || (R[1]>='A' && R[1]<='F') ) && R[2]==',' &&
R[3]=='R' && ( (R[4]>='0' && R[4]<='9') || (R[4]>='A' && R[4]<='F') ) && R[5]== 0 )
{
DtB(HtD(R[1]),bin4);
DtB(HtD(R[4]),bin3);
cout << "0100" << "0000" << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"ADDI") ) //5RST
{
if( R[0]=='R' && ( (R[1]>='0' && R[1]<='9') || (R[1]>='A' && R[1]<='F') ) && R[2]==',' &&
R[3]=='R' && ( (R[4]>='0' && R[4]<='9') || (R[4]>='A' && R[4]<='F') ) && R[5]==',' &&
R[6]=='R' && ( (R[7]>='0' && R[7]<='9') || (R[7]>='A' && R[7]<='F') ) && R[8]== 0 )
{
DtB(HtD(R[1]),bin2);
DtB(HtD(R[4]),bin3);
DtB(HtD(R[7]),bin4);
cout << "0101" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"ADDF") ) //6RST
{
if( R[0]=='R' && ( (R[1]>='0' && R[1]<='9') || (R[1]>='A' && R[1]<='F') ) && R[2]==',' &&
R[3]=='R' && ( (R[4]>='0' && R[4]<='9') || (R[4]>='A' && R[4]<='F') ) && R[5]==',' &&
R[6]=='R' && ( (R[7]>='0' && R[7]<='9') || (R[7]>='A' && R[7]<='F') ) && R[8]== 0 )
{
DtB(HtD(R[1]),bin2);
DtB(HtD(R[4]),bin3);
DtB(HtD(R[7]),bin4);
cout << "0110" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"OR") ) //7RST
{
if( R[0]=='R' && ( (R[1]>='0' && R[1]<='9') || (R[1]>='A' && R[1]<='F') ) && R[2]==',' &&
R[3]=='R' && ( (R[4]>='0' && R[4]<='9') || (R[4]>='A' && R[4]<='F') ) && R[5]==',' &&
R[6]=='R' && ( (R[7]>='0' && R[7]<='9') || (R[7]>='A' && R[7]<='F') ) && R[8]== 0 )
{
DtB(HtD(R[1]),bin2);
DtB(HtD(R[4]),bin3);
DtB(HtD(R[7]),bin4);
cout << "0111" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"AND") ) //8RST
{
if( R[0]=='R' && ( (R[1]>='0' && R[1]<='9') || (R[1]>='A' && R[1]<='F') ) && R[2]==',' &&
R[3]=='R' && ( (R[4]>='0' && R[4]<='9') || (R[4]>='A' && R[4]<='F') ) && R[5]==',' &&
R[6]=='R' && ( (R[7]>='0' && R[7]<='9') || (R[7]>='A' && R[7]<='F') ) && R[8]== 0 )
{
DtB(HtD(R[1]),bin2);
DtB(HtD(R[4]),bin3);
DtB(HtD(R[7]),bin4);
cout << "1000" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"XOR") ) //9RST
{
if( R[0]=='R' && ( (R[1]>='0' && R[1]<='9') || (R[1]>='A' && R[1]<='F') ) && R[2]==',' &&
R[3]=='R' && ( (R[4]>='0' && R[4]<='9') || (R[4]>='A' && R[4]<='F') ) && R[5]==',' &&
R[6]=='R' && ( (R[7]>='0' && R[7]<='9') || (R[7]>='A' && R[7]<='F') ) && R[8]== 0 )
{
DtB(HtD(R[1]),bin2);
DtB(HtD(R[4]),bin3);
DtB(HtD(R[7]),bin4);
cout << "1001" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"ROR") ) //AR0X
{
if( RL[0]=='R' && ((RL[1]>='0' && RL[1]<='9') || (RL[1]>='A' && RL[1]<='F')) && RL[2]==',')
{
if(RR[0]>='0' && RR[0]<='9')
{
for(i=0,j=0 ; ( RR[i]!=' ' && RR[i]!='\t' && RR[i]!='\0' ) ; i++)
if( RR[i]>='0' && RR[i]<='9' )
XY[j++] = RR[i];
else
break;
XY[j] = 0;
k=i;
while(RR[k]!='\0')
if(RR[k]==' ' || RR[k]=='\t')
k++;
else
Error(org);
xy = CtD(XY);
for(i=0,j=0 ; ( RR[i]!='\0' && RR[i]!=';' ) ; i++) //RR陣列去空白
if(RR[i] == ' ' || RR[i] == '\t')
continue;
else
RR[j++] = RR[i];
RR[j] = 0;
for(i=0 ; RR[i]!='\0'; i++)
continue;
if( RR[i]=='\0' && xy<16 )
{
DtB(HtD(RL[1]),bin2);
DecToHex(xy,hex);
DtB(hex[1],bin4);
cout << "1010" << bin2 << "0000" << bin4 ;
}
else
Error(org);
}
else
Error(org);
}
else
Error(org);
}
else if( !strcmp(L,"JMPEQ") ) //BRXY
{
if ( RL[0]=='R' && ( (RL[1]>='0' && RL[1]<='9') || (RL[1]>='A' && RL[1]<='F') ) && RL[2]=='=' &&
RL[3]=='R' && RL[4]=='0' && RL[5]==',' )
{
if(RR[0]>='0' && RR[0]<='9')
{
for(i=0,j=0 ; ( RR[i]!=' ' && RR[i]!='\t' && RR[i]!='\0' ) ; i++)
if( RR[i]>='0' && RR[i]<='9' )
XY[j++] = RR[i];
else
break;
XY[j] = 0;
k=i;
while(RR[k]!='\0')
if(RR[k]==' ' || RR[k]=='\t')
k++;
else
Error(org);
xy = CtD(XY);
for(i=0,j=0 ; ( RR[i]!='\0' && RR[i]!=';' ) ; i++) //RR陣列去空白
if(RR[i] == ' ' || RR[i] == '\t')
continue;
else
RR[j++] = RR[i];
RR[j] = 0;
for(i=0 ; RR[i]!='\0'; i++)
continue;
if( RR[i]=='\0' && xy<256 )
{
DtB( HtD(RL[1]) ,bin2);
DecToHex(xy,hex);
DtB(hex[0],bin3);
DtB(hex[1],bin4);
cout << "1011" << bin2 << bin3 << bin4 ;
}
else
Error(org);
}
else
Error(org);
}
else
Error(org);
}
else if( !strcmp(L,"JMP") ) //B0XY
{
for(i=0,j=0 ; ( RJ[i]!=' ' && RJ[i]!='\t' && RJ[i]!='\0' ) ; i++)
if( RJ[i]>='0' && RJ[i]<='9' )
XY[j++] = RJ[i];
else
break;
XY[j] = 0;
k=i;
while(RJ[k]!='\0')
if(RJ[k]==' ' || RJ[k]=='\t')
k++;
else
Error(org);
xy = CtD(XY);
for(i=0 ; RJ[i]!='\0'; i++)
continue;
if( RJ[i]=='\0' && xy<256 )
{
DecToHex(xy,hex);
DtB(hex[0],bin3);
DtB(hex[1],bin4);
cout << "1011" << "0000" << bin3 << bin4 ;
}
else
Error(org);
}
else if( !strcmp(L,"HALT") ) //C000
{
if(R[0]=='\0')
cout << "1100" << "0000" << "0000" << "0000" ;
else
Error(org);
}
else
Error(org);
}
return 0;
}