Example #1
0
int main()
{
    /*
    int endian = 0x01020304;
    char *ptr = (char *)&endian;
    for(int i=0 ; i<4 ; i++){
        printf("%d ", *ptr);
        ptr++;
    }
    */
    int PC=0;
    int InstruNum = 0;
    int SP=0;
    int MemNum = 0;
    int cycle = 0;
    int i;



    FILE* pFile;
    long lSize;
    FILE* dFile;
    long dSize;
    FILE* snap;
  //unsigned char* buffer;
    size_t result;
    InstruM* m = new InstruM();
    Memory* n = new Memory();

  pFile = fopen ( "iimage.bin" , "rb" );
  dFile = fopen ( "dimage.bin" , "rb" );
  snap = fopen("snapshot.rpt" , "w");

  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell(pFile);
  rewind (pFile);

  fseek (dFile , 0 , SEEK_END);
  dSize = ftell(dFile);
  rewind (dFile);


  cout << lSize << ' ';

  // allocate memory to contain the whole file:
  //buffer = (unsigned char*) malloc (sizeof(unsigned char)*lSize);
  //if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (m->pc_instrunum,sizeof(unsigned char),8,pFile);
  fread (n->sp_memnum,sizeof(unsigned char),8,dFile);

  PC |= m->pc_instrunum[0];
  PC <<= 8;
  PC |= m->pc_instrunum[1];
  PC <<= 8;
  PC |= m->pc_instrunum[2];
  PC <<= 8;
  PC |= m->pc_instrunum[3];

  InstruNum |= m->pc_instrunum[4];
  InstruNum <<= 8;
  InstruNum |= m->pc_instrunum[5];
  InstruNum <<= 8;
  InstruNum |= m->pc_instrunum[6];
  InstruNum <<= 8;
  InstruNum |= m->pc_instrunum[7];

  SP |= n->sp_memnum[0];
  SP <<= 8;
  SP |= n->sp_memnum[1];
  SP <<= 8;
  SP |= n->sp_memnum[2];
  SP <<= 8;
  SP |= n->sp_memnum[3];

  MemNum |= n->sp_memnum[4];
  MemNum <<= 8;
  MemNum |= n->sp_memnum[5];
  MemNum <<= 8;
  MemNum |= n->sp_memnum[6];
  MemNum <<= 8;
  MemNum |= n->sp_memnum[7];

  fread (&(m->InM)[PC],sizeof(unsigned char),lSize-8,pFile);
  fread (n->mem,sizeof(unsigned char),dSize-8,dFile);

  cout <<lSize<< ' '<<result;
  //if (result+64 != lSize) {fputs ("Reading error",stderr); exit (3);}

 cout << endl;

  m->storetoIns(PC);


  printf("%d\n", dSize);
  printf("%d\n", MemNum);

  for(int y=0; y<10; y++){
    printf("%04x\n",n->mem[y]);
  }
  /* the whole file is now loaded in the memory buffer. */



   // terminate
  //fclose (pFile);




  printf("\n%d\n", PC);
  printf("%08x\n", InstruNum);

  printf("%08x\n", m->Ins[0]);

printf("%Test\n");
   printf("%08x\n", m->rtopcode(PC+4));
    printf("%08x\n", m->rtrs(PC+4));
     printf("%08x\n", m->rtrt(PC+4));
      printf("%08x\n", m->rtrd(PC+4));
       printf("%08x\n", m->rtshamt(PC+4));
        printf("%08x\n", m->rtfunct(PC+4));
         printf("%08x\n", m->rtaddress(PC+4));
           printf("%08x\n", m->rtimmediate(PC+4));


  fclose(pFile);
  fclose(dFile);
//  free (buffer);




//int i = PC+4;
Reg* reg = new Reg();
Function* func = new Function();


//func->add(m,i,reg,n);

reg->reg[29] = SP;

    printf("TTTT: %08x\n", m->rtopcode(PC) == 0x00);


   while((m->rtopcode(PC))!= 0x3F){

        fprintf(snap, "cycle %d\n",cycle);
        cycle++;
        for(i=0;i<32;i++){
            fprintf(snap, "$%02d: 0x%08X\n", i, reg->reg[i]);
        }
        fprintf(snap,"PC: 0x%08X\n\n\n", PC);




        if(m->rtopcode(PC) == 0x00){
            switch(m->rtfunct(PC)){
        case 0x20:
            func->add(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x21:
            func->addu(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x22:
            func->sub(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x24:
            func->And(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x25:
            func->Or(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x26:
            func->Xor(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x27:
            func->nor(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x28:
            func->nand(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x2A:
            func->slt(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x00:
            func->sll(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x05:
            func->srl(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x03:
            func->sra(m,PC,reg);
            PC = PC + 4;
            break;
        case 0x08:
            PC = reg->reg[m->rtrs(PC)];
            break;
        default:
                PC = PC + 4;
                break;
            }
        }else{
            switch(m->rtopcode(PC)){
            case 0x08:{
                func->addi(m,PC,reg);
                PC = PC + 4;
                break;
            }
            case 0x09:
                func->addiu(m,PC,reg);
                PC = PC + 4;
                break;
            case 0x23:
                func->lw(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x21:
                func->lh(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x25:
                func->lhu(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x20:
                func->lb(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x24:
                func->lbu(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x2B:
                func->sw(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x29:
                func->sh(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x28:
                func->sb(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x0F:
                func->lui(m,PC,reg,n);
                PC = PC + 4;
                break;
            case 0x0C:
                func->andi(m,PC,reg);
                PC = PC + 4;
                break;
            case 0x0D:
                func->ori(m,PC,reg);
                PC = PC + 4;
                break;
            case 0x0E:
                func->nori(m,PC, reg);
                PC = PC + 4;
                break;
            case 0x0A:
                func->slti(m,PC, reg);
                PC = PC + 4;
                break;
            case 0x04:
                PC = func->beq(m,PC, reg);
                break;
            case 0x05:
                PC = func->bne(m,PC, reg);
                break;
            case 0x07:
                PC = func->bgtz(m,PC,reg);
                break;
            case 0x02:
                PC = func->j(m,PC,reg);
                break;
            case 0x03:
                PC = func->jal(m,PC,reg);
                break;
            default:
                PC = PC +4;
                break;
            }

        }






   }
    fprintf(snap, "cycle %d\n",cycle);
        cycle++;
        for(i=0;i<32;i++){
            fprintf(snap, "$%02d: 0x%08X\n", i, reg->reg[i]);
        }
        fprintf(snap,"PC: 0x%08X\n\n\n", PC);




    unsigned short aa = 0xFFFF;
    unsigned int a = 0xF1234567;
    unsigned int b;
    b =aa;
    unsigned char a1,a2,a3,a4;
    a1 = a;
    a=a>>8;
    a2 = a;
    a = a>>8;
    a3 = a;
    a =a>>8;
    a4 =a;

    unsigned int aaa = 0xFFFFFFFF;
    int bbb = 0xFFFFFFFF;
    printf("%08x\n",a1);
    printf("%08x\n",a2);
    printf("%08x\n",a3);
    printf("%08x\n",a4);
    printf("%08x\n",b);
    printf("%08x\n",aaa>>28);
    printf("%08x\n",bbb>>28);

    fclose(snap);

  return 0;




}