pkgsrc/emulators/gpsim/patches/patch-ae
2004-05-02 20:08:14 +00:00

187 lines
4.6 KiB
Text

$NetBSD: patch-ae,v 1.3 2004/05/02 20:08:14 bouyer Exp $
--- src/uart.cc.orig 2004-01-31 03:58:04.000000000 +0100
+++ src/uart.cc 2004-04-30 18:56:31.000000000 +0200
@@ -139,11 +139,16 @@
cout << "TXSTA - enabling transmitter\n";
if(txreg) {
cout << " TXSTA - does have a txreg\n";
- if(txreg->is_empty())
txreg->empty();
- else
+#if 0
+ if(txreg->is_empty()) {
+ txreg->empty();
+ } else {
+ cout << "start_transmitting1" << endl;
start_transmitting();
}
+#endif
+ }
} else
stop_transmitting();
}
@@ -431,47 +436,53 @@
void _RCSTA::receive_a_bit(unsigned int bit)
{
- if(bit_count)
- {
+ // If we're waiting for the start bit and this isn't it then
+ // we don't need to look any further
+ // cout << "receive_a_bit state " << state << "bit " << bit << endl;
+ if( state == RCSTA_MAYBE_START) {
+ if (bit)
+ state = RCSTA_WAITING_FOR_START;
+ else
+ state = RCSTA_RECEIVING;
+ return;
+ }
+ if (bit_count == 0) {
+ // we should now have the stop bit
+ if (bit) {
+ // got the stop bit
+ // If the rxreg has data from a previous reception then
+ // we have a receiver overrun error.
+ // cout << "rcsta.rsr is full\n";
+
+ if((value & RX9) == 0)
+ rsr >>= 1;
+
+ // copy the rsr to the fifo
+ if(rcreg)
+ rcreg->push( rsr & 0xff);
+ //cout << "_RCSTA::receive_a_bit received 0x" << (rsr & 0xff) << endl;
+
+ } else {
+ //not stop bit; discard the data and go back receiving
+ }
+ // If we're continuously receiving, then set up for the next byte.
+ // FIXME -- may want to set a half bit delay before re-starting...
+ if(value & CREN)
+ start_receiving();
+ else
+ state = RCSTA_DISABLED;
+ return;
+ }
- // If we're waiting for the start bit and this isn't it then
- // we don't need to look any further
- if( (state == RCSTA_WAITING_FOR_START) && bit)
- return;
-
- // Copy the bit into the Receive Shift Register
- if(bit)
- rsr |= 1<<9;
-
- //cout << "Receive bit #" << bit_count << ": " << (rsr&(1<<9)) << '\n';
-
- rsr >>= 1;
-
- if(--bit_count == 0)
- {
- // rsr is full.
-
- // If the rxreg has data from a previous reception then
- // we have a receiver overrun error.
- //cout << "rcsta.rsr is full\n";
-
- if((value & RX9) == 0)
- rsr >>= 1;
-
- // copy the rsr to the fifo
- if(rcreg)
- rcreg->push( rsr & 0xff);
-
- // If we're continuously receiving, then set up for the next byte.
- // FIXME -- may want to set a half bit delay before re-starting...
- if(value & CREN)
- start_receiving();
- else
- state = RCSTA_DISABLED;
- }
+ // Copy the bit into the Receive Shift Register
+ if(bit)
+ rsr |= 1<<9;
- }
+ //cout << "Receive bit #" << bit_count << ": " << (rsr&(1<<9)) << '\n';
+
+ rsr >>= 1;
+ bit_count--;
}
@@ -494,11 +505,11 @@
// Is this a 9-bit data reception?
if(value & RX9)
{
- bit_count = 10;
+ bit_count = 9;
}
else
{
- bit_count = 9;
+ bit_count = 8;
}
state = RCSTA_WAITING_FOR_START;
@@ -526,11 +537,11 @@
if(txsta && (txsta->value & _TXSTA::BRGH))
set_callback_break(BRGH_FIRST_MID_SAMPLE);
else
- set_callback_break(BRGH_FIRST_MID_SAMPLE);
+ set_callback_break(BRGL_FIRST_MID_SAMPLE);
sample = 0;
- state = RCSTA_WAITING_MID1;
-
+ sample_state = RCSTA_WAITING_MID1;
+ state = RCSTA_MAYBE_START;
}
void _RCSTA::callback(void)
@@ -538,7 +549,7 @@
//cout << "RCSTA callback " << (cycles.value) << '\n';
- switch(state) {
+ switch(sample_state) {
case RCSTA_WAITING_MID1:
if(uart_port->get_bit(rx_bit))
sample++;
@@ -548,7 +559,7 @@
else
set_callback_break(BRGL_SECOND_MID_SAMPLE - BRGL_FIRST_MID_SAMPLE);
- state = RCSTA_WAITING_MID2;
+ sample_state = RCSTA_WAITING_MID2;
break;
@@ -561,7 +572,7 @@
else
set_callback_break(BRGL_THIRD_MID_SAMPLE - BRGL_SECOND_MID_SAMPLE);
- state = RCSTA_WAITING_MID3;
+ sample_state = RCSTA_WAITING_MID3;
break;
@@ -573,13 +584,13 @@
sample = 0;
// If this wasn't the last bit then go ahead and set a break for the next bit.
- if(state==RCSTA_WAITING_MID3) {
+ if(state==RCSTA_RECEIVING) {
if(txsta && (txsta->value & _TXSTA::BRGH))
set_callback_break(TOTAL_BRGH_STATES -(BRGH_THIRD_MID_SAMPLE - BRGH_FIRST_MID_SAMPLE));
else
set_callback_break(TOTAL_BRGL_STATES -(BRGL_THIRD_MID_SAMPLE - BRGL_FIRST_MID_SAMPLE));
- state = RCSTA_WAITING_MID1;
+ sample_state = RCSTA_WAITING_MID1;
}
break;