I recently setup a development system for the Odyssey 2 so I could dig into some of the capabilities of the system. I am looking to improve the documentation I wrote back in the 90's to support the home-brew community and maybe improve the O2EM emulator. The first thing I took a look at is the X/Y position registers which seem to work differently then any of the current documentation describes.
The purpose of these registers is to get the current X and Y position of the electron beam that is drawing the graphics on the CRT. Knowing the position could be useful to do mid-screen graphics changes. The registers are read from the VDC chip at location $A5 for the X position and $A4 for the Y position. Before you can read the values you must set bit one of the VDC Control Register ($A0) to 1 which will latch in the current position. Bit one in the VDC Status Register will be set to 1 to indicate that the beam has been latched. This bit just follows that state of the latch bit in the control register so wouldn't seem to have a purpose, but I will explain later what I think it is for.
Once the beam position is latched the registers can be read, but from my testing I found that you have to read the X position first before you can read the Y. If you do not do this you get an indeterminate value from the Y register. I also verified this in the game Blockout which reads the X registers, throws away the value and then reads the Y.
I did some tests on the X register and could not get reliable results from reading it. Even if it was reliable the CPU just wouldn't be fast enough to read the registers for any meaningful purpose.
The Y register start at 0 at the end of Vblank and increments to $F7 before the start of the next Vblank. It remains $F7 for the duration of Vblank before resetting back to 0.
According to the Intel datasheet on the 8244 VDC chip, there is a pin called STB that can also be used to latch the beam position. This pin is not used on the Odyssey 2, but I assume the intention of this pin was to support a light gun. This would also explain the need for bit one in the status register which indicates that the position has been latched, I assume this register would also be set by the external pin.
A test program can be found here that demonstrates the relationship between the scanline counter and the Y Position Register.
https://github.com/danlb2000/Odyssey-2/tree/main/PositionRegiserTest