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[]) //字元轉換成大寫
{
other

    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;
}