diff --git a/src/main/java/com/loomcom/symon/devices/Acia6850.java b/src/main/java/com/loomcom/symon/devices/Acia6850.java index 3621887..bae935b 100644 --- a/src/main/java/com/loomcom/symon/devices/Acia6850.java +++ b/src/main/java/com/loomcom/symon/devices/Acia6850.java @@ -86,6 +86,20 @@ public class Acia6850 extends Acia { throw new MemoryAccessException("No register."); } } + + @Override + public synchronized int rxRead() { + overrun = false; + return super.rxRead(); + } + + @Override + public synchronized void rxWrite(int data) { + if(rxFull) { + overrun = true; + } + super.rxWrite(data); + } private void setCommandRegister(int data) { diff --git a/src/test/java/com/loomcom/symon/AciaTest6850.java b/src/test/java/com/loomcom/symon/AciaTest6850.java index 487bf53..5181bc7 100644 --- a/src/test/java/com/loomcom/symon/AciaTest6850.java +++ b/src/test/java/com/loomcom/symon/AciaTest6850.java @@ -125,6 +125,24 @@ public class AciaTest6850 { assertEquals(0x01, acia.read(CMD_STAT_REG) & 0x03); } + + @Test + public void aciaShouldOverrunAndReadShouldReset() + throws Exception { + + Acia acia = newAcia(); + + // overrun ACIA + acia.rxWrite('a'); + acia.rxWrite('b'); + + assertEquals(0x20, acia.read(CMD_STAT_REG) & 0x20); + + // read should reset + acia.rxRead(); + assertEquals(0x00, acia.read(CMD_STAT_REG) & 0x20); + + } @Test public void readingBuffersShouldResetStatus()