Vs. System: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (add links to VS system things)
(remove musing from $4020 writeup. Discovered watchdog timer on $4017, described.)
Line 39: Line 39:
   ++------- Coin inserted
   ++------- Coin inserted


=== Controller 1 data and DIP switches ($4017 read) ===
=== Controller 1 data, DIP switches, and [[wikipedia:watchdog timer|watchdog timer]] ($4017 read) ===
  7  bit  0
  7  bit  0
  ---- ----
  ---- ----
Line 46: Line 46:
  |||| || +- Buttons for player 1 (A, B, 2, 4, Up, Down, Left, Right)
  |||| || +- Buttons for player 1 (A, B, 2, 4, Up, Down, Left, Right)
  ++++-++--- More DIP switches
  ++++-++--- More DIP switches
The game must read from $4017 more often than once every second, or the CPU, PPU, and bit at $4020 are reset.
The time limit is an analog effect, so may vary by up to a factor of 3 in either direction.


=== Coin acknowledge ($4020-$403F, &c) ===
=== Coin acknowledge ($4020-$403F, &c) ===
Line 55: Line 58:
                   |          |
                   |          |
                   |          +- 1: (write) Acknowledge coin insertion
                   |          +- 1: (write) Acknowledge coin insertion
                   +------------ 1: (read) Acknowledge coin insertion
                   +------------ 1: (read) Acknowledge coin insertion but see below


The port is mirrored across the entire range of $4020-$5FFF. Writing 0 with a coin to be acknowledged or 1 without a coin to be acknowledged is a no-op; it is not known what the effect would be of writing 0 without a coin to be acknowledged. Reading from the register effectively writes the value of open bus (i.e. the last byte fetched from ROM, usually the LSB)
The port is mirrored across the entire range of $4020-$5FFF.
When the latched value is 1, it drives a relay in the coin acceptor; specifically what happens then is unknown, but you should assume it resets the coin bits in $4016.
This register is explicitly cleared on powerup and reset.
Reading from the register effectively writes the value of open bus (i.e. the last byte fetched from ROM, usually the LSB)
No games use any of this bit's mirrors, or try to read from it.


== See also ==
== See also ==

Revision as of 20:56, 16 July 2013

The Vs. Unisystem and Vs. Dualsystem are arcade system boards based on the NES.

Palette

There are several different RGB PPUs used in Vs. games. To determine which PPU is used, read the PPU type byte of the NES 2.0 header if available; otherwise, use the hash of the PRG and CHR ROM data.

2C03
This PPU is used in Duck Hunt and Tennis, as well as the PlayChoice, Famicom Titler, and Famicom TVs. Its colors closely resemble those of the 2C02 in the standard NTSC NES.
2C04
There are four versions of this PPU with different palettes. This was used as a form of copy protection, so that games would have wrong colors if someone were to burn a new PRG ROM and CHR ROM and put them on the game PCB.
2C05
This PPU has the same colors as the 2C03, but it swaps the meanings of $2000 and $2001 and returns a constant identifying value in bits 4-0 of $2002. This is also for copy protection.

Registers

Registers $4016 and $4017 have additional bits related to coin insertion and difficulty switches, and $4020 is a new register. The controllers are swapped: $4017 on the left and $4016 on the right. The 2C05 swaps PPUCTRL and PPUMASK. Otherwise, all registers have the same meanings as on the NES or PlayChoice.

Controller and CHR ROM bank ($4016 write)

7  bit  0
---- ----
xxxx xCRS
      |||
      ||+- 1 then 0: Request a report from the controller ports
      |+-- In the DualSystem, connects to 1- /IRQ of the other CPU and 2- when high on the primary
      |      specifies that 2KiB of RAM is mapped from $6000-$7FFF, else mapped for the secondary CPU
      +--- Select 8 KiB CHR ROM bank for PPU $0000-$1FFF (mapper 99 games only)
           Note: In case of games with 40KiB PRG-ROM (as found in VS Gumshoe),
                 the above bit additionally changes 8KiB PRG-ROM at $8000-$9FFF.

Controller 2 data, coins, and DIP switches ($4016 read)

7  bit  0
---- ----
xCCD DSxB
 ||| || |
 ||| || +- Buttons for player 2 (A, B, 1, 3, Up, Down, Left, Right)
 ||| |+--- Service button (commonly inserts a credit)
 ||+-+---- DIP switches
 ++------- Coin inserted

Controller 1 data, DIP switches, and watchdog timer ($4017 read)

7  bit  0
---- ----
DDDD DDxB
|||| || |
|||| || +- Buttons for player 1 (A, B, 2, 4, Up, Down, Left, Right)
++++-++--- More DIP switches

The game must read from $4017 more often than once every second, or the CPU, PPU, and bit at $4020 are reset. The time limit is an analog effect, so may vary by up to a factor of 3 in either direction.

Coin acknowledge ($4020-$403F, &c)

Inserting a coin turns the coin bits of $4016 on. They do not turn off until the program acknowledges the credit by writing here.

15   address 4    0  7  bit  0
---- ---- ---- ----  ---- ----
010x xxxx xx1x xxxA  xxxx xxxC
                  |          |
                  |          +- 1: (write) Acknowledge coin insertion
                  +------------ 1: (read) Acknowledge coin insertion but see below

The port is mirrored across the entire range of $4020-$5FFF. When the latched value is 1, it drives a relay in the coin acceptor; specifically what happens then is unknown, but you should assume it resets the coin bits in $4016. This register is explicitly cleared on powerup and reset. Reading from the register effectively writes the value of open bus (i.e. the last byte fetched from ROM, usually the LSB) No games use any of this bit's mirrors, or try to read from it.

See also