// ECE 201 MP4
// Stage 1
// Need to be translated to MIPS assembly language and run on SPIM
#include <stdio.h>
#include <stdlib.h>
#define MAXMEM 13
// variables in the simulator program that simulate features of the
// MIPS architecture. Here, r[] and m[] are just arrays in the memory
long r[32];
long ir,pc,a,b,aluout;
long m[MAXMEM] = {0x1284820, 0x1495020, 0x22A9020, 0x1284820, 0x1495020, 0x24A9820, 0x1284820, 0x1495020, 0x26AA020, 0x1284820, 0x1495020, 0x28AA820, 0x1000FFFF};
// This function simulates the subset of R-type instructions
// all other possible MIPS func codes return 0, rather than
// the correct result
long alufunc(long a, long b, int func)
{
long ia,ib;
if (func == 32) //add
return (a + b);
else if (func == 34) //sub
return (a - b);
else if (func == 36) //and
return (a & b);
else if (func == 37) //or
return (a | b);
else if (func == 39) //nor
return (~(a|b));
else if (func == 42) //slt
return ((a<b) ? 1 : 0);
else
return(0);
}
// This function extracts a subset of bits from the middle of a
// 32-bit word. It is assumed 31 >= left >= right >= 0
// For example, extract(0x12345678,23,16) returns 0x34
long extract(long x, int left, int right)
{
unsigned long mask,result;
mask = 1;
if (left==31)
mask = 0xFFFFFFFF;
else
mask = (mask << (left+1)) - 1;
result = (x&mask);
if (right!=0)
result = result >> right;
return (result);
}
//Print one hexadecimal char '0' .. '9' or 'A' .. 'F'
void hexdig(long dig)
{
if (dig < 10)
printf("%c",dig+'0');
else
printf("%c",dig+'A'-10);
}
// Print 32-bit value as hexadecimal
// There is quite a bit that has to be done here to
// translate to MIPS assembly language. The value needs to
// be broken into 8 ASCII chars by calls to extract and hexdig
void printhex(long x)
{
hexdig(extract(x,31,28));
hexdig(extract(x,27,24));
hexdig(extract(x,23,20));
hexdig(extract(x,19,16));
hexdig(extract(x,15,12));
hexdig(extract(x,11,8));
hexdig(extract(x,7,4));
hexdig(extract(x,3,0));
}
// Print registers of interest in childish division program
void traceout()
{
printf("pc="); //print a string in memory, e.g. syscall 4
printhex(pc);
printf(" ir=");
printhex(ir);
printf(" a=");
printhex(a);
printf(" b=");
printhex(b);
printf(" aluout=");
printhex(aluout);
printf("\n");
printf(" v0=");
printhex(r[2]);
printf(" a0=");
printhex(r[4]);
printf(" a1=");
printhex(r[5]);
printf(" t1=");
printhex(r[9]);
printf(" t2=");
printhex(r[10]);
printf(" t4=");
printhex(r[12]);
printf("\n");
printf(" s1=");
printhex(r[17]);
printf(" s2=");
printhex(r[18]);
printf(" s3=");
printhex(r[19]);
printf(" s4=");
printhex(r[20]);
printf(" s5=");
printhex(r[21]);
printf("\n");
// getchar();
}
int main()
{
int opcode; //convenient to use local since compared multiple times
r[8] = 6; //t0 = 6 as needed by Babbage
r[10] = 1; //t2 = 1 as needed by Babbage
r[17] = 1; //s1 = 1 as needed by Babbage
pc = 0;
ir = 0;
while(ir != 0x1000ffff) //would be infinite loop in hardware
{
ir = m[pc];
pc = pc + 4;
a = r[extract(ir,25,21)];
b = r[extract(ir,20,16)];
traceout();
opcode = extract(ir,31,26);
if (opcode==0)
{ //r-type
aluout = alufunc(a,b,extract(ir,10,0));
if (extract(ir,15,11) != 0) //not in hardware--prevent losing 0 in R0
{
r[extract(ir,15,11)] = aluout;
}
}
}
}
Ly8gRUNFIDIwMSBNUDQKLy8gU3RhZ2UgMQovLyBOZWVkIHRvIGJlIHRyYW5zbGF0ZWQgdG8gTUlQUyBhc3NlbWJseSBsYW5ndWFnZSBhbmQgcnVuIG9uIFNQSU0KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSBNQVhNRU0gMTMKLy8gdmFyaWFibGVzIGluIHRoZSBzaW11bGF0b3IgcHJvZ3JhbSB0aGF0IHNpbXVsYXRlIGZlYXR1cmVzIG9mIHRoZQovLyBNSVBTIGFyY2hpdGVjdHVyZS4gSGVyZSwgcltdIGFuZCBtW10gYXJlIGp1c3QgYXJyYXlzIGluIHRoZSBtZW1vcnkKbG9uZyByWzMyXTsKbG9uZyBpcixwYyxhLGIsYWx1b3V0Owpsb25nIG1bTUFYTUVNXSA9IHsweDEyODQ4MjAsIDB4MTQ5NTAyMCwgMHgyMkE5MDIwLCAweDEyODQ4MjAsIDB4MTQ5NTAyMCwgMHgyNEE5ODIwLCAweDEyODQ4MjAsIDB4MTQ5NTAyMCwgMHgyNkFBMDIwLCAweDEyODQ4MjAsIDB4MTQ5NTAyMCwgMHgyOEFBODIwLCAweDEwMDBGRkZGfTsKLy8gVGhpcyBmdW5jdGlvbiBzaW11bGF0ZXMgdGhlIHN1YnNldCBvZiBSLXR5cGUgaW5zdHJ1Y3Rpb25zCi8vIGFsbCBvdGhlciBwb3NzaWJsZSBNSVBTIGZ1bmMgY29kZXMgcmV0dXJuIDAsIHJhdGhlciB0aGFuCi8vIHRoZSBjb3JyZWN0IHJlc3VsdApsb25nIGFsdWZ1bmMobG9uZyBhLCBsb25nIGIsIGludCBmdW5jKQp7CmxvbmcgaWEsaWI7CmlmIChmdW5jID09IDMyKSAvL2FkZApyZXR1cm4gKGEgKyBiKTsKZWxzZSBpZiAoZnVuYyA9PSAzNCkgLy9zdWIKcmV0dXJuIChhIC0gYik7CmVsc2UgaWYgKGZ1bmMgPT0gMzYpIC8vYW5kCnJldHVybiAoYSAmIGIpOwplbHNlIGlmIChmdW5jID09IDM3KSAvL29yCnJldHVybiAoYSB8IGIpOwplbHNlIGlmIChmdW5jID09IDM5KSAvL25vcgpyZXR1cm4gKH4oYXxiKSk7CmVsc2UgaWYgKGZ1bmMgPT0gNDIpIC8vc2x0CnJldHVybiAoKGE8YikgPyAxIDogMCk7CmVsc2UKcmV0dXJuKDApOwp9Ci8vIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgYSBzdWJzZXQgb2YgYml0cyBmcm9tIHRoZSBtaWRkbGUgb2YgYQovLyAzMi1iaXQgd29yZC4gSXQgaXMgYXNzdW1lZCAzMSA+PSBsZWZ0ID49IHJpZ2h0ID49IDAKLy8gRm9yIGV4YW1wbGUsIGV4dHJhY3QoMHgxMjM0NTY3OCwyMywxNikgcmV0dXJucyAweDM0CmxvbmcgZXh0cmFjdChsb25nIHgsIGludCBsZWZ0LCBpbnQgcmlnaHQpCnsKdW5zaWduZWQgbG9uZyBtYXNrLHJlc3VsdDsKbWFzayA9IDE7CmlmIChsZWZ0PT0zMSkKbWFzayA9IDB4RkZGRkZGRkY7CmVsc2UKbWFzayA9IChtYXNrIDw8IChsZWZ0KzEpKSAtIDE7CnJlc3VsdCA9ICh4Jm1hc2spOwppZiAocmlnaHQhPTApCnJlc3VsdCA9IHJlc3VsdCA+PiByaWdodDsKcmV0dXJuIChyZXN1bHQpOwp9Ci8vUHJpbnQgb25lIGhleGFkZWNpbWFsIGNoYXIgJzAnIC4uICc5JyBvciAnQScgLi4gJ0YnCnZvaWQgaGV4ZGlnKGxvbmcgZGlnKQp7CmlmIChkaWcgPCAxMCkKcHJpbnRmKCIlYyIsZGlnKycwJyk7CmVsc2UKcHJpbnRmKCIlYyIsZGlnKydBJy0xMCk7Cn0KLy8gUHJpbnQgMzItYml0IHZhbHVlIGFzIGhleGFkZWNpbWFsCi8vIFRoZXJlIGlzIHF1aXRlIGEgYml0IHRoYXQgaGFzIHRvIGJlIGRvbmUgaGVyZSB0bwovLyB0cmFuc2xhdGUgdG8gTUlQUyBhc3NlbWJseSBsYW5ndWFnZS4gVGhlIHZhbHVlIG5lZWRzIHRvCi8vIGJlIGJyb2tlbiBpbnRvIDggQVNDSUkgY2hhcnMgYnkgY2FsbHMgdG8gZXh0cmFjdCBhbmQgaGV4ZGlnCnZvaWQgcHJpbnRoZXgobG9uZyB4KQp7CmhleGRpZyhleHRyYWN0KHgsMzEsMjgpKTsKaGV4ZGlnKGV4dHJhY3QoeCwyNywyNCkpOwpoZXhkaWcoZXh0cmFjdCh4LDIzLDIwKSk7CmhleGRpZyhleHRyYWN0KHgsMTksMTYpKTsKaGV4ZGlnKGV4dHJhY3QoeCwxNSwxMikpOwpoZXhkaWcoZXh0cmFjdCh4LDExLDgpKTsKaGV4ZGlnKGV4dHJhY3QoeCw3LDQpKTsKaGV4ZGlnKGV4dHJhY3QoeCwzLDApKTsKfQovLyBQcmludCByZWdpc3RlcnMgb2YgaW50ZXJlc3QgaW4gY2hpbGRpc2ggZGl2aXNpb24gcHJvZ3JhbQp2b2lkIHRyYWNlb3V0KCkKewpwcmludGYoInBjPSIpOyAvL3ByaW50IGEgc3RyaW5nIGluIG1lbW9yeSwgZS5nLiBzeXNjYWxsIDQKcHJpbnRoZXgocGMpOwpwcmludGYoIiBpcj0iKTsKcHJpbnRoZXgoaXIpOwpwcmludGYoIiBhPSIpOwpwcmludGhleChhKTsKcHJpbnRmKCIgYj0iKTsKcHJpbnRoZXgoYik7CnByaW50ZigiIGFsdW91dD0iKTsKcHJpbnRoZXgoYWx1b3V0KTsKcHJpbnRmKCJcbiIpOwpwcmludGYoIiB2MD0iKTsKcHJpbnRoZXgoclsyXSk7CnByaW50ZigiIGEwPSIpOwpwcmludGhleChyWzRdKTsKcHJpbnRmKCIgYTE9Iik7CnByaW50aGV4KHJbNV0pOwpwcmludGYoIiB0MT0iKTsKcHJpbnRoZXgocls5XSk7CnByaW50ZigiIHQyPSIpOwpwcmludGhleChyWzEwXSk7CnByaW50ZigiIHQ0PSIpOwpwcmludGhleChyWzEyXSk7CnByaW50ZigiXG4iKTsKcHJpbnRmKCIgczE9Iik7CnByaW50aGV4KHJbMTddKTsKcHJpbnRmKCIgczI9Iik7CnByaW50aGV4KHJbMThdKTsKcHJpbnRmKCIgczM9Iik7CnByaW50aGV4KHJbMTldKTsKcHJpbnRmKCIgczQ9Iik7CnByaW50aGV4KHJbMjBdKTsKcHJpbnRmKCIgczU9Iik7CnByaW50aGV4KHJbMjFdKTsKcHJpbnRmKCJcbiIpOwovLyBnZXRjaGFyKCk7Cn0KaW50IG1haW4oKQp7CmludCBvcGNvZGU7IC8vY29udmVuaWVudCB0byB1c2UgbG9jYWwgc2luY2UgY29tcGFyZWQgbXVsdGlwbGUgdGltZXMKcls4XSA9IDY7IC8vdDAgPSA2IGFzIG5lZWRlZCBieSBCYWJiYWdlCnJbMTBdID0gMTsgLy90MiA9IDEgYXMgbmVlZGVkIGJ5IEJhYmJhZ2UKclsxN10gPSAxOyAvL3MxID0gMSBhcyBuZWVkZWQgYnkgQmFiYmFnZQpwYyA9IDA7CmlyID0gMDsKd2hpbGUoaXIgIT0gMHgxMDAwZmZmZikgLy93b3VsZCBiZSBpbmZpbml0ZSBsb29wIGluIGhhcmR3YXJlCnsKaXIgPSBtW3BjXTsKcGMgPSBwYyArIDQ7CmEgPSByW2V4dHJhY3QoaXIsMjUsMjEpXTsKYiA9IHJbZXh0cmFjdChpciwyMCwxNildOwp0cmFjZW91dCgpOwpvcGNvZGUgPSBleHRyYWN0KGlyLDMxLDI2KTsKaWYgKG9wY29kZT09MCkKeyAvL3ItdHlwZQphbHVvdXQgPSBhbHVmdW5jKGEsYixleHRyYWN0KGlyLDEwLDApKTsKaWYgKGV4dHJhY3QoaXIsMTUsMTEpICE9IDApIC8vbm90IGluIGhhcmR3YXJlLS1wcmV2ZW50IGxvc2luZyAwIGluIFIwCnsKcltleHRyYWN0KGlyLDE1LDExKV0gPSBhbHVvdXQ7Cn0KfQp9Cn0=