Namco Pac-Man/Memory Mapped I/O

Sprite Attributes (read/write, $4FF2-4FFD)
The twelve bytes from $4FF2 through 4FFD choose sprite pattern number, palette, and flip mode. First byte/MSB ($4FF2, $4FF4, $4FF6, $4FF8, $4FFA, $4FFC) 7 bit  0 SSSS SSXY |||| |||| |||| |||+- Y/Vertical flip |||| ||+-- X/Horizontal flip ++++-++--- Pattern Number (00-3F) Second byte/LSB ($4FF3, $4FF5, $4FF7, $4FF9, $4FFB, $4FFD) 7 bit  0 ...P PPPP | ||||   +-++++- Palette entry (00-1F)

$4FF0, $4FF1, $4FFE, and $4FFF are never drawn because the video hardware is drawing 36 columns of tiles instead of 32.

IN0 (read-only, $5000-503F)
Reads return Player 1's joystick, "rack" test switch, coin acceptors, and "credit" button inputs

7 bit  0 cCsT DRLU |||| |||| |||| |||+- Player 1 Joystick Up     (0 = up, 1 = down) |||| ||+-- Player 1 Joystick Left   (0 = up, 1 = down) |||| |+--- Player 1 Joystick Right  (0 = up, 1 = down) |||| + Player 1 Joystick Down   (0 = up, 1 = down |||+-- Rack Test switch          (0 = on, 1 = off) ||+--- Coin slot 1               (trigger by alternating bit to 0 then 1) |+ Coin slot 2               (trigger by alternating bit to 0 then 1) +- Credit button             (0 = up, 1 = down)

IN1 (read-only, $5040-507F)
Reads return Player 2's joystick, service mode switch, start buttons, and cabinet mode switch inputs 7 bit  0 CsSM DRLU |||| |||| |||| |||+- Player 2 Joystick Up   (0 = up, 1 = down) |||| ||+-- Player 2 Joystick Left (0 = up, 1 = down) |||| |+--- Player 2 Joystick Right (0 = up, 1 = down) |||| + Player 2 Joystick Down (0 = up, 1 = down) |||+-- Service mode switch    (0 = on, 1 = off) ||+--- Start button 1         (0 = up, 1 = down) |+ Start button 2         (0 = up, 1 = down) +- Cabinet mode           (0 = cocktail, 1 = upright)

DIPSW (read-only, $5080-50BF)
Reads return six DIP switches and two solder jumpers

Open bus (read-only, $50C0-50FF)
Reads aren't driven.

Interrupt enable and acknowledge (write-only, $5000, $5008, ... $5038)
If high, start of vblank asserts Z80 /IRQ input. If low, /IRQ input is reset and start of vblank cannot assert Z80 /IRQ input.

Mute (write-only, $5001, $5009, ... $5039)
If low, sound generator DAC and volume multipler is forced to zero. If high, sound generator DAC works normally

Ignored (write-only, $5002, $5004, $5005, $5006, $500A, ... $503E)
These four latched bits exist, but are connected to nothing.

Screen rotation (write-only, $5003, $500B, ... $503B)
If high, the tilemap, sprites, and tiles are rotated 180 degrees. For use in cocktail cabinets.

Coin counter (write-only, $5007, $500F, ... $503F)
If high, the coin counter pin is pulled low.

Sound RAM 1 (write-only, $5040-504F)
RAM is only 4 bits wide: top 4 bits are ignored.

The exact interpretation of these nybbles depends on the contents of the sound sequencer ROM.

The stock ROM uses
 * $5045: Voice 1 waveform selector (bottom 3 bits)
 * $504A: Voice 2 waveform selector
 * $504F: Voice 3 waveform selector

Sound RAM 2 (write-only, $5050-505F)
RAM is only 4 bits wide: top 4 bits are ignored.

The exact interpretation of these nybbles depends on the contents of the sound sequencer ROM.

The stock ROM uses:
 * $5050-5054: 20 bits of waveform pitch as a fraction of 96kHz
 * $5055: Voice 1 volume
 * $5056-5059: 16 bits of waveform pitch
 * $505A: Voice 2 volume
 * $505B-505E: 16 bits of waveform pitch.
 * $505F: Voice 3 volume

Sprite coordinates (write-only, $5062-506D)
Big number = top right corner. First byte/MSB ($5062, $5064, $5066, $5068, $506A, $506C) 7 bit  0 XXXX XXXX |||| |||| +++--++++- Sprite X-axis/Horizontal position (00-FF) Second byte/LSB ($5063, $5065, $5067, $5069, $506B, $506D) 7 bit  0 YYYY YYYY |||| |||| +++--++++- Sprite Y-axis/Vertical position (00-FF)

Bytes at $5060, 5061, 506E, 506F exist but aren't used

Ignored (write-only, $5070-50BF)
No hardware listens to writes in these addresses

Watchdog reset (write-only, $50C0-50FF)
A counter is incremented every vblank. Writes to this address clear this counter. When 15, the CPU and the registers at $5000-5007 are reset.