As I understood it, the WDC65C02 fixes the spurious reads which afflict the NMOS 6502 during dead bus cycles. Specifically for indexed addressing, it does so by re-reading the last instruction byte rather than the "partial" target address.
According to the data sheet on page 30, indexing across a page boundary would cause the 65C02 to re-read the opcode. Are you crossing a page boundary with any instructions that access to DUART? If not, you may have discovered new errata in the 65C02.
But, to my surprise, single-cycling the SBC shows the processor puts $8000 on the address bus in the cycle preceding the write when executing this:
LDY #0
STA $8000,Y
Did I make a mistake or does the 'C02 generate spurious reads during indexed store operations?
Good question. The above doesn't cross a page boundary. How are you qualifying reads and writes on the DUART? What happens if you index with
.X instead of
.Y?
The device has one of those I/O registers where otherwise harmless reads have specific side-effects.
An inadvertent read on some registers, such as registers
$0E and
$0F, can trigger actions that are not anticipated in the code. This is not a unique characteristic of the DUART. For example, an inadvertent read of the 65C22's interrupt status register could clear a pending interrupt that has yet to be serviced.
Also, you have to be careful to not do a read on write-only registers, such as the channel command registers (
$02 and
$0A), as doing so may trigger some kind of hinkiness in the DUART.
Of course, I happened to be using indexed addressing to configure the UART and I was seeing all sorts of seemingly unpredictable behavior; behaviour which in fact could be explained by a spurious read moving the goal posts on the configuration writes. More investigation confirmed the UART registers were not set up correctly, and after confirming with the single-cycle clock, a change to absolute addressing fixed everything!

. The UART is now solid (albeit with minimal testing at this point). Good news for the SBC, but it certainly left me wondering about those spurious reads.
What you are describing is what I encountered with the 2692 in my first iteration of POC V1. In that case, I used the 65C816's
VDA and
VPA outputs to qualify memory cycles and was able to eliminate the problem. I'm not sure how you would go about achieving a similar behavior with the 65C02. It's a real waste of code space to have to use absolute addressing.
The interrupt mechanism is very well behaved, and I was able to get service routines working fairly quickly (using a buffering scheme I adapted from BDD's POC1 firmware - very nicely done BDD, thank you).
What I like about the DUART's interrupt mechanism is that the interrupt status register (register
$05) is a real-time register and you don't have to do anything special to clear all but one of the IRQs.