summaryrefslogtreecommitdiff
path: root/emulators/gpsim/patches/patch-ae
diff options
context:
space:
mode:
Diffstat (limited to 'emulators/gpsim/patches/patch-ae')
-rw-r--r--emulators/gpsim/patches/patch-ae187
1 files changed, 187 insertions, 0 deletions
diff --git a/emulators/gpsim/patches/patch-ae b/emulators/gpsim/patches/patch-ae
new file mode 100644
index 00000000000..1148c1fae02
--- /dev/null
+++ b/emulators/gpsim/patches/patch-ae
@@ -0,0 +1,187 @@
+$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;