I did a small update, now the sprite bug should be gone, although that did reveal another potential bug as can be seen in the picture below: the lower right hand corner has a missing block for whatever reason... But at least there are no red sprites in there.
While fixing the VDP, I also added a few more extra read only registers. These are 16-bit registers available in the address space of the CPU. Mostly they are there for convenience to have direct VDP memory pointers, VGA scanning registers actually allow changing of VDP memory synchronised to the scan.
|8880||High byte returns contents of VDP register 0 (low byte zero)|
|8882||High byte returns contents of VDP register 1 (low byte zero)|
|8884||Pattern memory pointer in VDP memory (based on reg 2)|
|8886||Color table pointer in VDP memory (based on reg 3)|
|8888||Character table base address in VDP memory (based on reg 4)|
|888A||Sprite attribute table base in VDP memory (based on reg 5)|
|888C||Sprite pattern table base in VDP memory (based on reg 6)|
|888E||High byte returns contents of VDP reg 7 (colours), low byte zero|
|8890||Current value of VDP memory pointer|
|8892||VGACol - current VGA scan column|
|8894||VGARow - current VGA scan row|
|8896||MSB: line buffer bank (toggles between 0 and 1, VGA refresh hardware reads from linebuffer indicated by this bit).|
LSB: 1=when display blanking active
Bits 14..1: 0 when read