Beispiel #1
0
/* Funct wb, stage five, assumes the mwBasket */
void wb(MIPS_SIM* sim, FDB* fdBasket, DEB* deBasket, EMB* emBasket, MWB* mwBasket)
{
   /* Check in Basket */
   unsigned func = getFunct(mwBasket->ir);
   if(mwBasket->mdr != 0 || mwBasket->aluOut != 0 || func == 0x2A)
   {
      int funct = getFunct(mwBasket->ir);
      printf(" ----  In WB  ----\n");
      switch (mwBasket->type)
      {
         case 0: /* R type */
            /* need two jumps else */
            if(funct == 0x08) /* jr */
            {
               printf("in wb: exe jr\n");
               sim->pcValue = sim->regs[mwBasket->aluOut];
               basketDefault(fdBasket, deBasket, emBasket, mwBasket);
            }
            else if(funct == 0x09)
            {
               printf("in wb: exe jalr\n");
               sim->regs[31] = sim->pcValue;
               sim->pcValue = sim->regs[mwBasket->aluOut];
               basketDefault(fdBasket, deBasket, emBasket, mwBasket);
            }
            else
               sim->regs[getrd(mwBasket->ir)] = mwBasket->aluOut;
            printRegs(sim);
            clearmw(mwBasket);
            break;

         case 1: /* I type */

            printf("in wb: exe I type\n");
            sim->regs[mwBasket->bReg] = mwBasket->aluOut;
             printRegs(sim);
             clearmw(mwBasket);
            break;

         case 2: /* Load Word */

            printf("in wb: exe lw type\n");
            if(mwBasket->mdr != 0)
               sim->regs[mwBasket->bReg] = mwBasket->mdr;
                printRegs(sim);
                clearmw(mwBasket);
            break;
      }
      clearmw(mwBasket);
   }
   else
      return;

}
Beispiel #2
0
/* Funct m, stage 4 / Memory, assumes the em and mw Baskets */
void m(MIPS_SIM* sim, EMB* emBasket, MWB* mwBasket) /* memory write */
{
   if(emBasket->aluOut != 0)
   {
      int opc = emBasket->ir >> 26;
      printf("--- In Mem ---\n");
      if(isStore(opc))  /* For Store Word Insturctions */
      {
         printf("in m: exe store type\n");
         switch(opc)
         {
            case 0x28: /* store byte */

               mem[emBasket->aluOut] = emBasket->bReg & 0x000000FF;
               break;

            case 0x29: /* store half word */

               mem[emBasket->aluOut] = emBasket->bReg & 0x0000FFFF;
               break;

            case 0x2B: /* store word */

               mem[emBasket->aluOut] = emBasket->bReg;
               break;
         }
         printRegs(sim);
         clearem(emBasket);
      }
      else           /* For Load Word Instrustions */
      {
         if(mwBasket->wBusy)
            return;
         else
         {
            printf("in mem: exe load type\n");
            mwBasket->wBusy = 1;
            mwBasket->type = 2;
            mwBasket->mdr = mem[emBasket->aluOut]; /* write to mdr */
            clearem(emBasket);
         }
      }
   }
Beispiel #3
0
/*
 * Default:
 * argc = 1
 * argv[0] =  Nome do Programa
 */
int main(int argc, char** argv) {
    char * filename = NULL;
    int passoAPassoFlag = 0;
    int c;
    int maxMem = 256;
    int startIndex = 1;
    int startIndexPrint = 1;
    int endIndexPrint = 255;
    opterr = 0;

    while ((c = getopt(argc, argv, "i:f:m:n:ps:")) != -1)
        switch (c) {
            case 'i':
                startIndexPrint = atoi(optarg);
                break;
            case 'f':
                endIndexPrint = atoi(optarg);
                break;
            case 'm':
                maxMem = atoi(optarg);
                break;
            case 'n':
                filename = optarg;
                break;
            case 'p':
                passoAPassoFlag = 1;
                break;
            case 's':
                startIndex = atoi(optarg);
                break;
            case '?':
                switch (optopt) {
                    case 'i':
                    case 'f':
                    case 'm':
                    case 'n':
                    case 's':
                        fprintf(stderr, "Opção -%c necessita um argumento.\n", optopt);
                        break;
                    default:
                        if (isprint(optopt))
                            fprintf(stderr, "Opção desconhecida `-%c'.\n", optopt);
                        else
                            fprintf(stderr, "Caractere de opção desconhecido `\\x%x'.\n", optopt);
                        abort();
                }
        }

    if (filename == NULL) {
        fprintf(stderr, "Erro nome do arquivo HEX não especificado!\n");
        abort();
    }
    FILE * hex = fopen(filename, "r");
    if (!hex) {
        fprintf(stderr, "Erro ao abrir o arquivo %s!\n", filename);
        abort();
    }

    inicializaMem(startIndexPrint, endIndexPrint, maxMem);

    if (loadProgram(hex, startIndex)) {
        fprintf(stderr, "Erro ao carregar o %s para a memória!\n", filename);
        abort();
    }

    inicializaSimulador();

    do {
        busca();
        if (passoAPassoFlag) {
            printf("Precione 'r' para imprimir os registradores e seguir um passo na execução,\n"
                    "'c' para continuar a execução sem o passo a passo,\n"
                    "ou qualquer outra tecla para seguir um passo na execução: ");            
            char * str = malloc(2);
            scanf("%s", str);
            if (strcmp(str, "r")==0)
                printRegs();
            else if (strcmp(str, "c") == 0)
                passoAPassoFlag = 0;
            printf("\n");
        }
        executa();
    } while (1);
    return EXIT_SUCCESS;
}