QString MainWindow::translateStoreRegister(const QString &_command)
{
    QStringList tokens = _command.split(" ");
    QString operation = tokens.first().toLower().trimmed();

    if(operation != "store_register")
    {
        qDebug() << "translateStoreRegister wrong command" << _command;
    }

    QString r1 = tokens.at(1);
    QString r2 = tokens.at(2);

    qDebug() << tokens.first() << r1 << r2 << "0";
    return operationToNumber(operation) + registerToNumber(r1) + registerToNumber(r2) + "0";
}
QString MainWindow::translateMinus(const QString &_command)
{
    QStringList tokens = _command.split(" ");
    QString operation = tokens.first().toLower().trimmed();

    if(operation != "sub")
    {
        qDebug() << "translateAdd wrong command" << _command;
    }

    QString r1 = tokens.at(1);
    QString r2 = tokens.at(2);
    QString r3 = tokens.at(3);

    qDebug() << tokens.first() << r1 << r2 << r3;
    return operationToNumber(operation) + registerToNumber(r1) + registerToNumber(r2) + registerToNumber(r3);
}
QString MainWindow::translateStoreFixed(const QString &_command)
{
    QStringList tokens = _command.split(" ");
    QString operation = tokens.first().toLower().trimmed();

    if(operation != "store_fixed")
    {
        qDebug() << "translateStoreFixed wrong command" << _command;
    }

    QString r1 = tokens.at(1);
    QString address = tokens.at(2);

    qDebug() << tokens.first() << r1 << address;
    return operationToNumber(operation) + registerToNumber(r1) + fillHexNumbers(address);
}
QString MainWindow::translateAddRegisterSecondHalf(const QString &_command)
{
    QStringList tokens = _command.split(" ");
    QString operation = tokens.first().toLower().trimmed();

    if(operation != "add_register_second_half")
    {
        qDebug() << "translateAddRegisterSecondHalf wrong command" << _command;
    }

    QString r1 = tokens.at(1);
    QString value = tokens.at(2);

    qDebug() << tokens.first() << r1 << value;
    return operationToNumber(operation) + registerToNumber(r1) + fillHexNumbers(value);
}
Beispiel #5
0
int Assemble(char *command, unsigned int current_pc)
{
    char operator[8],s_reg[10];
    int i=0;
    unsigned int b_opcode, b_rd, b_rs, b_rt, b_sa, b_func = 0, b_immediate, b_target, b_format, b_ft, b_fs, b_fd;
    if ( command[0]==0 )
        return 0x00000000;
    i = get_string_assemble(&operator[0],command, i, sizeof(operator), " ");
    if(isDebug)  printf("%s  ", operator);
    if ( strcmp(operator, "q")==0 )
        return 0xffffff00;
    if ( operator[strlen(operator)-1]==':' ) {
        return 0xfffffff0;
    }
    //R-Type Instructions
    b_opcode = 0b000000;
    b_rd = 0;
    b_rs = 0;
    b_rt = 0;
    b_sa = 0;
    if ( strcmp(operator, "add")==0 ) {
        b_func = 0b100000;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "addu")==0 ) {
        b_func = 0b100001;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "and")==0 ) {
        b_func = 0b100100;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "break")==0 ) {
        b_func = 0b001101;
    }
    else if ( strcmp(operator, "div")==0 ) {
        b_func = 0b011010;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "divu")==0 ) {
        b_func = 0b011011;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "jalr")==0 ) {
        b_func = 0b001001;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "jr")==0 ) {
        b_func = 0b001000;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "mfhi")==0 ) {
        b_func = 0b010000;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "mflo")==0 ) {
        b_func = 0b010010;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "mthi")==0 ) {
        b_func = 0b010001;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "mtlo")==0 ) {
        b_func = 0b010011;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "mult")==0 ) {
        b_func = 0b011000;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "multu")==0 ) {
        b_func = 0b011001;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "nor")==0 ) {
        b_func = 0b100111;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "or")==0 ) {
        b_func = 0b100101;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "sll")==0 ) {
        b_func = 0b000000;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_sa = strToInt(s_reg);
    }
    else if ( strcmp(operator, "sllv")==0 ) {
        b_func = 0b000100;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "slt")==0 ) {
        b_func = 0b101010;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "sltu")==0 ) {
        b_func = 0b101011;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "sra")==0 ) {
        b_func = 0b000011;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_sa = strToInt(s_reg);
    }
    else if ( strcmp(operator, "srav")==0 ) {
        b_func = 0b000111;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "srl")==0 ) {
        b_func = 0b000010;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_sa = strToInt(s_reg);
    }
    else if ( strcmp(operator, "srlv")==0 ) {
        b_func = 0b000110;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "sub")==0 ) {
        b_func = 0b100010;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "subu")==0 ) {
        b_func = 0b100011;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else if ( strcmp(operator, "syscall")==0 ) {
        b_func = 0b001100;
    }
    else if ( strcmp(operator, "xor")==0 ) {
        b_func = 0b100110;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rd = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
    }
    else
        b_func = 0xffffffff;
    if ( (b_rd|b_rs|b_rt|b_sa)==0xffffffff )
        return 0xffffffff;
    if(isDebug)  printf("R?  %x %x %x %x %x %x\n", b_opcode, b_rd, b_rs, b_rt, b_sa, b_func);
    if ( b_func != 0xffffffff )
        return (b_opcode<<26) | (b_rs<<21) | (b_rt<<16) | (b_rd<<11) | (b_sa<<6) | b_func;
    
    //I-Type Instructions
    b_rt = 0;
    b_rs = 0;
    b_immediate = 0;
    if ( strcmp(operator, "addi")==0 ) {
        b_opcode = 0b001000;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_immediate = strToInt(s_reg);
    }
    else if ( strcmp(operator, "addiu")==0 ) {
        b_opcode = 0b001001;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_immediate = strToInt(s_reg);
    }
    else if ( strcmp(operator, "andi")==0 ) {
        b_opcode = 0b001100;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_immediate = strToInt(s_reg);
    }
    else if ( strcmp(operator, "beq")==0 ) {
        b_opcode = 0b000100;
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rs = registerToNumber(s_reg);
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_rt = registerToNumber(s_reg);//PC <-- [PC] + 4 + ([I15]14 || [I15..0] || 02)
        i = get_string_assemble(&s_reg[0], command, i, sizeof(s_reg), ", ");b_immediate = (strToInt(s_reg)-4-current_pc)>>2&0b1111111111111111;
    }