diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ae9f884e3baded6b418ed7e162f9988752b3304a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +cMIPS/vhdl/*.o +cMIPS/vhdl/*.cf +cMIPS/vhdl/.last_import +cMIPS/tb_cmips +cMIPS/include/*.o +cMIPS/include/*~ +cMIPS/include/cMIPSio.s diff --git a/cMIPS/include/main.c b/cMIPS/include/main.c new file mode 100644 index 0000000000000000000000000000000000000000..f46dc897cd5a5195e600ed32caa372ed2bade68e --- /dev/null +++ b/cMIPS/include/main.c @@ -0,0 +1,122 @@ +#include<stdio.h> +#include "vetorFib.h" + +#define MAXPOW 7 + +int Strlen(char *c) +{ + int i= 0; + while(c[i++]); + return i-1; +} + +int pow16(int ex) +{ + int i, ret=1; + for (i= 0; i< ex/2; i++) + ret*=16; + ret *= ret; + return (ex%2?ret*16:ret); +} + +int hex2int(char *hex) +{ + int s= Strlen(hex), i, ans= 0; + for (i= 0; i< s; i++) { + switch(hex[i]) { + case 'F': + case 'f': + ans+= 15*pow16(s-(i+1)); + break; + case 'E': + case 'e': + ans+= 14*pow16(s-(i+1)); + break; + case 'D': + case 'd': + ans+= 13*pow16(s-(i+1)); + break; + case 'C': + case 'c': + ans+= 12*pow16(s-(i+1)); + break; + case 'B': + case 'b': + ans+= 11*pow16(s-(i+1)); + break; + case 'A': + case 'a': + ans+= 10*pow16(s-(i+1));; + break; + case '9': + ans+= 9*pow16(s-(i+1));; + break; + case '8': + ans+= 8*pow16(s-(i+1));; + break; + case '7': + ans+= 7*pow16(s-(i+1));; + break; + case '6': + ans+= 6*pow16(s-(i+1));; + break; + case '5': + ans+= 5*pow16(s-(i+1));; + break; + case '4': + ans+= 4*pow16(s-(i+1));; + break; + case '3': + ans+= 3*pow16(s-(i+1));; + break; + case '2': + ans+= 2*pow16(s-(i+1));; + break; + case '1': + ans+= 1*pow16(s-(i+1));; + break; + default: + if (hex[i] != '0') + printf("ERROR!\n"); + break; + } + } + return ans; +} + +int int2hex(char *c, int i) +{ + int j= 0, val; + int p; + p = pow16(MAXPOW); + while (p > 0) { + val= 0; + if (i/p) { + val= i/p; + i%= p; + } + if ((val < 10) && (j || val)) { // impede que '0' sejam escritos à esquerda + c[j++] = val+'0'; + } + else if (val > 9) + c[j++] = 'a'+ (val-10); + p/=16; + } + c[j] = 0; + return j-1; +} + +int main() +{ + char n[16], f[16]; + int fib; + while (scanf("%s", n) > 0) { + fib= hex2int(n); + if (fib < BUF_SZ) { + fib = buf[fib]; + int2hex(f, fib); + printf("%d(%s)\n", fib, f); + } else + printf("Valor fora dos limites!\n"); + } +} diff --git a/cMIPS/include/vetorFib.h b/cMIPS/include/vetorFib.h new file mode 100644 index 0000000000000000000000000000000000000000..98e75bafc84903ab9d03dada607238bd8da04f88 --- /dev/null +++ b/cMIPS/include/vetorFib.h @@ -0,0 +1,11 @@ +#define BUF_SZ 45 + +int buf[BUF_SZ] = { +1,1,2,3,5,8,13,21, +34,55,89,144,233,377,610,987, +1597,2584,4181,6765,10946,17711,28657,46368, +75025,121393,196418,317811,514229,832040,1346269,2178309, +3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155, +165580141,267914296,433494437,701408733 +}; +