VIC-II cache corruption

From: Michiel Boland <michiel_at_boland.org>
Date: Sat, 19 Oct 2019 18:01:56 +0200
Message-ID: <8ee383c8-6e4e-d864-a8f2-0aba300c2d97_at_boland.org>
Hi. I was trying to figure out screen corruption during VSP (or DMA Delay, or 
whatever it's called.)

Apparently the VIC-II video chip has a 40x12 bit cache (I guess it is a sort of 
built-in SRAM) to store the current row of 8-bit characters along with 4 bits 
for color information.

There are 40 word lines connected to the cache, let's call them W0 through W39. 
There is a mechanism in the chip that turns on each word line during one half of 
the clock cycle in sequence. The sequence cannot be interrupted, i.e. once you 
turn on W0, all remaining 39 word lines will be activated during the next 39 
clock cycles.

If you trigger a bad line at the right moment you can activate two word lines at 
once. This occurs not at the bad line itself, but at the start of the next line, 
when the first word line is activated. This will then interfere with the 'chain' 
of word lines that was still running from the manual bad line trigger.

A bit of ascii art to illustrate:

[manual trigger of bad line]
  W0
   W1
    W2
     W3
      W4
[... W5 - W36 skipped - start of next line ]
  W0                               W37
   W1                               W38
    W2                               W39
     W3
      W4
       etc.

Now the effect of this appears to be that the cache then gets corrupted, and 
characters (and colors) will appear duplicated. But even weirder still, a 
character can also influence the character next to it. Now this I just do not 
understand. One could argue that since this is undefined behaviour, anything 
could happen.

Some videos that illustrate what I am talking about:

https://youtu.be/Cn7QAWqhBjk
https://youtu.be/is1tfnGRh90

Code that you can run to try for yourself is at
http://www.michiel.boland.org/50demo3.s.txt

I was wondering if any more research has been done into this.

Cheers
Michiel
Received on 2020-05-29 23:15:52

Archive generated by hypermail 2.3.0.