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