From 44236238169b0371ae91b799fc22012a8bce8682 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Mon, 29 May 2023 22:51:58 +1000 Subject: [PATCH] Writing 0 to the 6551 ACIA's control register is not a program reset. So far as I can tell, ever since the first version of the ACIA emulation in Symon, writing 0x00 to the control register has been interpreted as a request to reset, rather than to actually set the control register to 0x00. This is strange for a number of reasons: - All-zeros is actually a very sensible value for the control register, and is in fact the hardware-reset default. - I can't find any description of such behaviour in the 6551, W65C51S, or W65C51N data sheets. - The 6551 already has a way to trigger "program reset" by writing to the status register. So I've removed that quirk, and writing to the control register now just writes to the control register and nothing else. --- .../com/loomcom/symon/devices/Acia6551.java | 113 ++++++++---------- 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/loomcom/symon/devices/Acia6551.java b/src/main/java/com/loomcom/symon/devices/Acia6551.java index 26902be..b9270a3 100644 --- a/src/main/java/com/loomcom/symon/devices/Acia6551.java +++ b/src/main/java/com/loomcom/symon/devices/Acia6551.java @@ -118,67 +118,60 @@ public class Acia6551 extends Acia { controlRegister = data; int rate = 0; - // If the value of the data is 0, this is a request to reset, - // otherwise it's a control update. - - if (data == 0) { - reset(); - } else { - // Mask the lower four bits to get the baud rate. - int baudSelector = data & 0x0f; - switch (baudSelector) { - case 0: - rate = 0; - break; - case 1: - rate = 50; - break; - case 2: - rate = 75; - break; - case 3: - rate = 110; // Real rate is actually 109.92 - break; - case 4: - rate = 135; // Real rate is actually 134.58 - break; - case 5: - rate = 150; - break; - case 6: - rate = 300; - break; - case 7: - rate = 600; - break; - case 8: - rate = 1200; - break; - case 9: - rate = 1800; - break; - case 10: - rate = 2400; - break; - case 11: - rate = 3600; - break; - case 12: - rate = 4800; - break; - case 13: - rate = 7200; - break; - case 14: - rate = 9600; - break; - case 15: - rate = 19200; - break; - } - - setBaudRate(rate); + // Mask the lower four bits to get the baud rate. + int baudSelector = data & 0x0f; + switch (baudSelector) { + case 0: + rate = 0; + break; + case 1: + rate = 50; + break; + case 2: + rate = 75; + break; + case 3: + rate = 110; // Real rate is actually 109.92 + break; + case 4: + rate = 135; // Real rate is actually 134.58 + break; + case 5: + rate = 150; + break; + case 6: + rate = 300; + break; + case 7: + rate = 600; + break; + case 8: + rate = 1200; + break; + case 9: + rate = 1800; + break; + case 10: + rate = 2400; + break; + case 11: + rate = 3600; + break; + case 12: + rate = 4800; + break; + case 13: + rate = 7200; + break; + case 14: + rate = 9600; + break; + case 15: + rate = 19200; + break; } + + setBaudRate(rate); }