The Williams hardware has a display resolution of 304 x 256, with 4 bits per pixel. The screen buffer is from $0000 to $97FF, coexisting with much of the ROM. Writes to these memory locations always go to RAM, and reads are controlled by the signal ROM_ENABLE, which is changed by writes to $C900, data bit 0. D0=1 means reads come from ROM, 0 means RAM.
In landscape orientation (Joust and Robotron, not Sinistar), pixel 0,0 is in the upper left corner, 0,255 is in the lower left, and 303,255 is in the lower right. Memory location $0000 is in the upper left, and increments down that column to $00FF in the lower left. So the y-coordinate of a pixel is equal to its memory address ANDed with $00FF.
The x-coordinate is a little tougher, since there are 2 pixels in each byte. So the x-coordinate of a pixel is equal to its memory address ANDed with $FF00 and shifted right 7 times, plus 1 if it is the low nibble.
Working the other way, the address of a pixel is y+int(x/2)*256; if x is even, the pixel is in the high nibble, otherwise it is in the low nibble.
Remember, these screen shots were created before MAME; I added an 8-bit port to my Joust machine and wrote software to transfer memory to a computer, then converted the raw data into GIFs.
Lotto Fun
Splat
Sinistar
Sinistar Default High Scores - one of many
Sinistar Game Adjustments Screen
Bubbles
Bubbles Game Adjustments Screen
Joust
Robotron
Robotron Game Adjustments Screen
Defender
Defender Game Adjustments Screen
Stargate
Stargate Game Adjustments Screen #1
Stargate Game Adjustments Screen #2
Diagnostics
First Screen of 'rug' RAM Test
Second Screen of 'rug' RAM Test
My Joust Machine pre-modification (same as above, but bigger)(164K)
Multi-Game Control Panel Side(15K)
Multi-Game Control Panel Front(12K)
Multi-Game Control Panel closeup(76K)
Multi-Game Control Panel Back(100K)
Here's a screen shot from my ROM Switcher. If you hit player 2 start now, Joust would run. Hit reset to return here, and hit player 1 start to go to the next game (with graphics from that game and a sound).
Multi-Game ROM Switcher Screen(3K)
Home made Sinistar speech board(92K)
Modified Joust PC Boards(131K)
Modified Joust ROM Board(112K)
Modified Joust Sound Board(83K)
Modified Joust CPU Board(125K)
Replacement Joust Power Supply(75K)
The older Robotron ROM version has a mistake in the game-over demo. When the scores for the Sphereoids and Quarks are shown, the Quarks are called Cubeoids. This is patched out in the later revision.
Typo in Robotron yel/ora ROMs (2.4K)
These are .WAV files sampled at 10K/sec.
Sinistar I Hunger coward!(22K)
Defender lander picking up man sound(10K)
Defender ship materialize sound(13K)
Joust pterodactyl cry sound(9K)