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