diff --git a/cMIPS/tests/handlerUARTjedi2.s b/cMIPS/tests/handlerUARTjedi2.s index 31644ba89a61437fad1da862373019d05d18aa3f..58e2dff6088ca9141c055458f267412d8729753b 100644 --- a/cMIPS/tests/handlerUARTjedi2.s +++ b/cMIPS/tests/handlerUARTjedi2.s @@ -27,7 +27,7 @@ ori $5, $5, %lo(nrx) lw $7, 0($5) slti $6, $7, 16 - beq $6, zero, overrun + beq $6, $zero, overrun nop addiu $7, $7, 1 sw $7, 0($5) diff --git a/cMIPS/tests/jedidafu.c b/cMIPS/tests/jedidafu.c new file mode 100644 index 0000000000000000000000000000000000000000..84ddda76a82171d9e53416bb3e87845d82042e7e --- /dev/null +++ b/cMIPS/tests/jedidafu.c @@ -0,0 +1,115 @@ +#include "cMIPS.h" + +typedef struct UARTdriver { +int rx_hd ; // reception queue head index +int rx_tl ; // reception queue tail index +char rx_q [16]; // reception queue +int tx_hd ; // transmission queue head index +int tx_tl ; // transmission queue tail index +char tx_q [16]; // transmission queue +int nrx ; // number of characters in rx_queue +int ntx ; // number of spaces in tx_queue +} UARTdriver ; +extern UARTdriver Ud ; + + +typedef struct control { // control register fields (uses only ls byte) + int ign : 24, // ignore uppermost bits + rts : 1, // Request to Send output (bit 7) + ign2 : 2, // bits 6,5 ignored + intTX : 1, // interrupt on TX buffer empty (bit 4) + intRX : 1, // interrupt on RX buffer full (bit 3) + speed : 3; // 4,8,16..256 tx-rx clock data rates (bits 0..2) +} Tcontrol; + +typedef struct status { // status register fields (uses only ls byte) + unsigned int ign : 24, // ignore uppermost 3 bytes + cts : 1, // Clear To Send input=1 (bit 7) + txEmpty : 1, // TX register is empty (bit 6) + rxFull : 1, // octet available from RX register (bit 5) + int_TX_empt: 1, // interrupt pending on TX empty (bit 4) + int_RX_full: 1, // interrupt pending on RX full (bit 3) + ign1 : 1, // ignored (bit 2) + framing : 1, // framing error (bit 1) + overun : 1; // overun error (bit 0) +} Tstatus; + + +typedef union ctlStat { // control + status on same address + Tcontrol ctl; // write-only + Tstatus stat; // read-only +} TctlStat; + +typedef union data { // data registers on same address + int tx; // write-only + int rx; // read-only +} Tdata; + +typedef struct serial { + TctlStat cs; + Tdata d; +} Tserial; + +char Getc () { + char c ; + if ( Ud.nrx > 0) { + disableInterr(); + // exclui handler enquanto altera Ud + Ud.nrx -= 1; + c = Ud.rx_q [ Ud.rx_hd ]; + Ud.rx_hd = (Ud.rx_hd + 1) & 15; // modulo 16 + enableInterr(); + } else { + c = 0; + } + return c ; +} + + +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; + Tcontrol ctrl; + + uart = (void *)IO_UART_ADDR; // bottom of UART address range + + ctrl.ign = 0; + ctrl.rts = 0; // make RTS=0 to hold RemoteUnit + ctrl.ign2 = 0; + ctrl.intTX = 0; + ctrl.intRX = 1; + ctrl.speed = 1; // operate at the second highest data rate + uart->cs.ctl = ctrl; + + i = -1; + + ctrl.ign = 0; + ctrl.rts = 1; // make RTS=1 to activate RemoteUnit + ctrl.ign2 = 0; + ctrl.intTX = 0; + ctrl.intRX = 1; + ctrl.speed = 1; // operate at the second highest data rate + uart->cs.ctl = ctrl; + + 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 (i<5); + + return(state+i); + +}