diff --git a/src/sbbs3/sbbsexec.c b/src/sbbs3/sbbsexec.c index ada74ea5ffee730fa9782d43484b5a9fa2d9af04..cbb87570fce5742f4dcf70fa7314f9240f42458c 100644 --- a/src/sbbs3/sbbsexec.c +++ b/src/sbbs3/sbbsexec.c @@ -178,6 +178,23 @@ void set_interrupt_pending(BYTE intr, BOOL assert) #define assert_interrupt(i) set_interrupt_pending(i, TRUE) #define deassert_interrupt(i) set_interrupt_pending(i, FALSE) +void data_waiting(BOOL waiting) +{ + if(waiting && (uart_mcr_reg & UART_MCR_RTS)) { + /* Set the "Data ready" bit in the LSR */ + uart_lsr_reg |= UART_LSR_DATA_READY; + + /* assert rx data interrupt */ + assert_interrupt(UART_IER_RX_DATA); + } else { + /* Clear the data ready bit in the LSR */ + uart_lsr_reg &= ~UART_LSR_DATA_READY; + + /* Clear data ready interrupt identification in IIR */ + deassert_interrupt(UART_IER_RX_DATA); + } +} + void _cdecl interrupt_thread(void *arg) { HANDLE handles[] = {interrupt_event, carrier_event}; @@ -241,10 +258,7 @@ void _cdecl input_thread(void* arg) RingBufWrite(&rdbuf,buf,count); if(virtualize_uart) { - /* Set the "Data ready" bit in the LSR */ - uart_lsr_reg |= UART_LSR_DATA_READY; - - assert_interrupt(UART_IER_RX_DATA); /* assert rx data interrupt */ + data_waiting(TRUE); } } lputs(LOG_DEBUG,"input_thread: terminated"); @@ -321,8 +335,9 @@ VOID uart_wrport(WORD port, BYTE data) if(uart_lcr_reg&UART_LCR_DLAB) { uart_divisor_latch_lsb = data; lprintf(LOG_DEBUG,"set divisor latch low byte: %02X", data); - } else { - lprintf(LOG_DEBUG,"WRITE DATA: %s", chr(data)); + } else { // Transmitter Holding Register + if(log_level >= LOG_DEBUG) + lprintf(LOG_DEBUG,"WRITE DATA: %s", chr(data)); if(!WriteFile(wrslot,&data,sizeof(BYTE),&retval,NULL)) { lprintf(LOG_ERR,"!VDD_WRITE: WriteFile Error %d (size=%d)" ,GetLastError(),retval); @@ -338,7 +353,7 @@ VOID uart_wrport(WORD port, BYTE data) lprintf(LOG_DEBUG,"set divisor latch high byte: %02X", data); } else { uart_ier_reg = data; - lprintf(LOG_INFO, "Set IER to %02X", data); + lprintf(LOG_DEBUG, "Set IER to %02X", data); } assert_interrupt(UART_IER_TX_EMPTY); /* should this be re-asserted for all writes? */ break; @@ -354,12 +369,7 @@ VOID uart_wrport(WORD port, BYTE data) uart_mcr_reg = data; if((uart_mcr_reg&UART_MCR_DTR) == 0) /* Dropping DTR (i.e. "hangup") */ hangup(); - if((uart_mcr_reg & UART_MCR_RTS) && RingBufFull(&rdbuf) > 0) { - assert_interrupt(UART_IER_RX_DATA); - } else { - deassert_interrupt(UART_IER_RX_DATA); - uart_lsr_reg &= ~UART_LSR_DATA_READY; - } + data_waiting(RingBufFull(&rdbuf)); lprintf(LOG_INFO, "Set MCR to %02X", data); break; case UART_SCRATCH: @@ -394,15 +404,7 @@ VOID uart_rdport(WORD port, PBYTE data) reset_yield(); } else *data=0; - if(avail==0) { - lputs(LOG_DEBUG,"No more data"); - /* Clear the data ready bit in the LSR */ - uart_lsr_reg &= ~UART_LSR_DATA_READY; - - /* Clear data ready interrupt identification in IIR */ - deassert_interrupt(UART_IER_RX_DATA); - } else /* re-assert RX data (increment the semaphore) */ - assert_interrupt(UART_IER_RX_DATA); + data_waiting(avail); break; case UART_IER: if(uart_lcr_reg&UART_LCR_DLAB) { @@ -432,7 +434,7 @@ VOID uart_rdport(WORD port, PBYTE data) SetEvent(interrupt_event); if(uart_fifo_enabled) *data |= UART_IIR_FIFO_ENABLED; - lprintf(LOG_INFO, "IIR: %02X (pending: %02X)", *data, pending_interrupts); + lprintf(LOG_DEBUG, "IIR: %02X (pending: %02X)", *data, pending_interrupts); break; } case UART_LCR: @@ -447,7 +449,7 @@ VOID uart_rdport(WORD port, PBYTE data) *data = uart_lsr_reg; /* Clear line status interrupt pending */ deassert_interrupt(UART_IER_LINE_STATUS); - lprintf(LOG_INFO, "LSR: %02X", *data); + lprintf(LOG_DEBUG, "LSR: %02X", *data); break; case UART_MSR: if(WaitForSingleObject(hungup_event,0)==WAIT_OBJECT_0)