diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp index 99a7b7ea4231cb60d075d62decfc74843d4c2855..4c217f34a0b7588d9cc2a11aa4697b7b579d3395 100644 --- a/cMIPS/serial.inp +++ b/cMIPS/serial.inp @@ -1,6 +1,8 @@ -abcdef -012345 -pqrstu -098765 +1 +2 +3 +4 +5 +2a diff --git a/cMIPS/tests/jedidafu.c b/cMIPS/tests/jedidafu.c index 84ddda76a82171d9e53416bb3e87845d82042e7e..876f38a14bb2bdd8774394a9ad06696746c7c08f 100644 --- a/cMIPS/tests/jedidafu.c +++ b/cMIPS/tests/jedidafu.c @@ -1,5 +1,7 @@ #include "cMIPS.h" +#include "../include/vetorFib.h" +#define MAXPOW 7 typedef struct UARTdriver { int rx_hd ; // reception queue head index int rx_tl ; // reception queue tail index @@ -50,6 +52,7 @@ typedef struct serial { Tdata d; } Tserial; + volatile Tserial *uart; // tell GCC not to optimize away code char Getc () { char c ; if ( Ud.nrx > 0) { @@ -60,17 +63,109 @@ char Getc () { Ud.rx_hd = (Ud.rx_hd + 1) & 15; // modulo 16 enableInterr(); } else { - c = 0; + c = -1; } return c ; } +int proberx () { + return Ud.nrx; +} +int Strlen (char *c) { + int i= 0; + while(c[i++]-10); + 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; + #if 0 + Test Signal... + switch (hex[0]) { + case 'F': + case 'f': + case 'E': + case 'e': + case 'D': + case 'd': + case 'C': + case 'c': + case 'B': + case 'b': + case 'A': + case 'a': + case '9': + ans = hex[0]*pow16(s-1); + } + #endif + for (i= 0; i< s; i++) { + hex[i]-= 48; + if (hex[i] > 9) + hex[i] -= 7; + if (hex[i] > 15) + hex[i] -= 32; + if(hex[i] < 0) + hex[i]=0; + ans += hex[i] * pow16(s-(i+1)); + } + 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] = 10; + return j-1; +} +int Putc (char c) { + int ntx = Ud.ntx; + if (ntx == 0) + return 0; + if (ntx == 16 && uart->cs.stat.txEmpty) // Empty Q && Tx + uart->d.tx = (unsigned int) c; // 32-bits + else { // Sending smthng + disableInterr(); + Ud.ntx--; + // INCREMENTS AND THEN STORE + Ud.tx_tl = (Ud.tx_tl+1)&0xF; // modulo 16 + Ud.tx_q[Ud.tx_tl] = c; + enableInterr(); + } + return 1; +} + int main(void) { // receive a string through the UART serial interface int i, j; volatile int state; - volatile Tserial *uart; // tell GCC not to optimize away code volatile Tstatus status; + char filona[145], c; + int hdona=0; + int tlona=0; + int filonx = 0; + int valfib, qt; + char p[15]; Tcontrol ctrl; uart = (void *)IO_UART_ADDR; // bottom of UART address range @@ -78,7 +173,7 @@ int main(void) { // receive a string through the UART serial interface ctrl.ign = 0; ctrl.rts = 0; // make RTS=0 to hold RemoteUnit ctrl.ign2 = 0; - ctrl.intTX = 0; + ctrl.intTX = 1; ctrl.intRX = 1; ctrl.speed = 1; // operate at the second highest data rate uart->cs.ctl = ctrl; @@ -88,26 +183,49 @@ int main(void) { // receive a string through the UART serial interface ctrl.ign = 0; ctrl.rts = 1; // make RTS=1 to activate RemoteUnit ctrl.ign2 = 0; - ctrl.intTX = 0; + ctrl.intTX = 1; ctrl.intRX = 1; ctrl.speed = 1; // operate at the second highest data rate uart->cs.ctl = ctrl; - + Ud.ntx = 16; do { state = i = i+1; - while(Ud.rx_tl == Ud.rx_hd){ to_stdout('d'); state = 1- state;} - - j = -1; - to_stdout('='); - do{ - j = j + 1; - //to_stdout(Ud.rx_q[j]); - to_stdout(Getc()); - if(Ud.rx_q[j] == '\n') - print(Ud.nrx); //nada ou string completa - }while(j<15); - to_stdout( '-'); - + while(!proberx()) to_stdout('-');//i = 1 - i; + to_stdout('\0'); + while((c=Getc()) != -1){ + filona[tlona] = c; + tlona++; + if(c=='\n') + filonx++; + /*if(c=='\n'){ + print(hex2int((filona+hdona))); + hdona = tlona; + }*/ + } + while(filonx > 0){ + qt = Strlen(filona+hdona); + valfib = hex2int((filona+hdona)); + print(valfib); + valfib = buf[valfib]; + print(valfib); + hdona += qt-1; + qt = int2hex(p, valfib); + j = -1; + do { + j++; + while(!Putc(p[j])); + } while (p[j] != 0); + filonx--; + } + /*for(j=0; j<145; j++) //isso aqui buga porque ele invalida os char quando hex2inteia + if(filona[j]==0 || filona[j]==10) + to_stdout('_'); + else + to_stdout(filona[j]); + to_stdout('\0'); + hdona = tlona; + print(hex2int((filona+hdona)));*/ + } while (i<5); return(state+i);