From 4a37dd74636d51a0276613b349faf281ade6a4b0 Mon Sep 17 00:00:00 2001 From: Maik Merten Date: Sat, 19 Jul 2014 17:10:57 +0200 Subject: [PATCH] move overrun detection and reset into the abstract superclass for ACIAs --- .../java/com/loomcom/symon/devices/Acia.java | 5 +++ .../com/loomcom/symon/devices/Acia6850.java | 37 ++++++------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/loomcom/symon/devices/Acia.java b/src/main/java/com/loomcom/symon/devices/Acia.java index e8664ef..f11b14e 100644 --- a/src/main/java/com/loomcom/symon/devices/Acia.java +++ b/src/main/java/com/loomcom/symon/devices/Acia.java @@ -108,11 +108,16 @@ public abstract class Acia extends Device { public synchronized int rxRead() { lastRxRead = System.nanoTime(); + overrun = false; rxFull = false; return rxChar; } public synchronized void rxWrite(int data) { + if(rxFull) { + overrun = true; + } + rxFull = true; if (receiveIrqEnabled) { diff --git a/src/main/java/com/loomcom/symon/devices/Acia6850.java b/src/main/java/com/loomcom/symon/devices/Acia6850.java index bae935b..5ae9de1 100644 --- a/src/main/java/com/loomcom/symon/devices/Acia6850.java +++ b/src/main/java/com/loomcom/symon/devices/Acia6850.java @@ -42,8 +42,8 @@ public class Acia6850 extends Acia { public static final int ACIA_SIZE = 2; - static final int STAT_REG = 0; // read-only - static final int CTRL_REG = 0; // write-only + static final int STAT_REG = 0; // read-only + static final int CTRL_REG = 0; // write-only static final int RX_REG = 1; // read-only static final int TX_REG = 1; // write-only @@ -57,7 +57,7 @@ public class Acia6850 extends Acia { public Acia6850(int address) throws MemoryRangeException { super(address, ACIA_SIZE, "ACIA6850"); - setBaudRate(2400); + setBaudRate(2400); } @Override @@ -87,28 +87,13 @@ public class Acia6850 extends Acia { } } - @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) { commandRegister = data; - // Bits 0 & 1 control the master reset - if((commandRegister & 0x01) != 0 && (commandRegister & 0x02) != 0) { - reset(); - } + // Bits 0 & 1 control the master reset + if((commandRegister & 0x01) != 0 && (commandRegister & 0x02) != 0) { + reset(); + } // Bit 7 controls receiver IRQ behavior receiveIrqEnabled = (commandRegister & 0x80) != 0; @@ -131,16 +116,16 @@ public class Acia6850 extends Acia { if (txEmpty && System.nanoTime() >= (lastTxWrite + baudRateDelay)) { stat |= 0x02; } - if (overrun) { - stat |= 0x20; - } + if (overrun) { + stat |= 0x20; + } return stat; } private synchronized void reset() { - overrun = false; + overrun = false; rxFull = false; txEmpty = true; }