diff --git a/cMIPS/include/main.c b/cMIPS/include/main.c index bc328f1f69293e4f95ed6da8b0ab07845aa411a8..5282a06410cac60adf6be4beac0338c849f93e0e 100644 --- a/cMIPS/include/main.c +++ b/cMIPS/include/main.c @@ -2,14 +2,49 @@ #include "vetorFib.h" #include "structUart.h" +#define OBOUND_MESG "Out of bounds\n" +#define OVERUN_MESG "Overun\n" #define MAXPOW 7 #define SPEED 3 #define COUNT ((SPEED+1)*100) +// ----------------------- begin driver? extern UARTdriver Ud; -Tcontrol ctrl; volatile Tserial *uart; +int proberx () { + return Ud.nrx; +} + +int probetx () { + return Ud.ntx; +} + +void ioctl (int c) { + uart->cs.ctl = (unsigned char)c; +} + +int ioctl () { + return uart->cs.stat; +} + +int Putc (char c) { + int ntx = probetx(); + if (ntx == 0) + return 0; + if (ntx == 16 && uart->cs.stat.txEmpty) // Empty Q && Tx + uart->d.tx = (int) c; // 32-bits + else { // Sending smthng + disableInterr(); + ud.ntx--; + Ud.tx_q[Ud.tx_tl] = c; + Ud.tx_tl = (Ud.tx_tl + 1)&0xF; // modulo 16 + enableInterr(); + } + return 1; +} +// ------------------------- end driver? +// ------------------------- begin main() int Strlen (char *c) { int i= 0; while(c[i++]-10); @@ -26,6 +61,25 @@ int pow16 (int ex) { 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) @@ -58,69 +112,37 @@ int int2hex (char *c, int i) { return j-1; } -int Putc (char c) { - if (Ud.ntx == 0) - return 0; - if (Ud.ntx == 16 && uart->cs.stat.txEmpty) // Empty Q && Tx - uart->d.tx = (int) c; // 32-bits - else { // Sending smthng - disableInterr(); - ud.ntx--; - Ud.tx_q[Ud.tx_tl] = c; - Ud.tx_tl = (Ud.tx_tl + 1)&0xF; // modulo 16 - enableInterr(); - } - return 1; -} - int main () { - uart= IO_UART_ADDR; + Tcontrol ctrl; char n[16], f[16], c; int fib, j, s, val; + + uart= IO_UART_ADDR; // initialize UART control ctrl.rts= 1; ctrl.intTX= 1; // Both interruption ctrl.intRX= 1; ctrl.speed= SPEED; - uart->cs.ctl = ctrl; + ioctl((int)ctrl); while (1) { j= 0; - while ((n[j++]= getFila()) != '\n'); - n[j] = '\n' - if (n[0] == 10) // critério de fim de transmissão - break; + /*************************** + ** Reception with tests ** + ***************************/ fib= hex2int(n); if (fib < BUF_SZ) { fib = buf[fib]; - s= int2hex(f, fib); //retorna strlen de f + s= int2hex(f, fib); // retorna strlen de f for (j= 0; j< s; j++) - Putc(f[j]); - } else { - to_stdout('v'); - to_stdout('a'); - to_stdout('l'); - to_stdout('o'); - to_stdout('r'); - to_stdout(' '); - to_stdout('m'); - to_stdout('u'); - to_stdout('i'); - to_stdout('t'); - to_stdout('o'); - to_stdout(' '); - to_stdout('g'); - to_stdout('r'); - to_stdout('a'); - to_stdout('n'); - to_stdout('d'); - to_stdout('e'); - to_stdout('\n'); - } + while(!Putc(f[j])); // enquanto fila de tranmissão está cheia + } else + for (j= 0; j<sizeof(BOUND_MESG); j++) + to_stdout(BOUND_MESG[j]); } + startCounter (COUNT , 0); while ((val= (readCounter() && 0x3FFFFFFF)) < COUNT); - // sleep?? - // yes, baby! + return val; }