The Vs. UniSystem and Vs. DualSystem are two different cabinet variations that use same "MDS-01-CPU" through "MDS-05-CPU" arcade boards. They are closely related to the NES.
Like two NESes, both CPUs have 2 KiB of RAM from $0000-$1FFF and a PPU at $2000-$3FFF. The PPUs are RGB ones, so colors and some registers may behave differently.
The CPUs are always the letterless revision, and the arcade board is incompatible with a 2A03G, so tonal noise is not supported. There are other resulting differences, but they do not seem to be relevant.
Registers to operate coin counters were added. The upper seven bits read from $4016 and $4017 have changed meaning.
2 KiB of shared RAM mapped from $6000-$7FFF was added. In the DualSystem it can be swapped between CPUs; in the UniSystem it is either ignored or a special jumper "2A04" was installed to give dedicated access. There's a holder for two AA batteries to provide battery backup for this RAM only. Vs. Ice Climber uses this RAM to count coins inserted into the coin slots on the main and sub systems.[1]
Unlike the NES, the Vs. System always provides 4 KiB of RAM for nametables, and all games always use 4-screen layout instead of horizontal or vertical mirroring
The Vs. System manual refers to the two sides as the "main" and "sub" sides, as does Vs. Ice Climber.[1] (Other video game concepts that use the "main" and "sub" terminology include Super NES color math, Sega CD CPUs, and Nintendo DS CPUs.)
The Vs. DualSystem has a main CPU, main PPU, sub CPU, and sub PPU. All four are fed by the same clock, and all four are released from reset by the watchdog at the same time. The RGB PPUs used in the Vs. System never have the missing dot that the 2C02 does, and so it is never possible for the two PPUs to not be anything but perfectly synchronized: on every PPU cycle, the exact same name table and attribute table fetches will happen at the same time. NMI, if enabled, will be asserted at the same time.
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.
Registers $4016 and $4017 have additional bits related to coin insertion and difficulty switches, and $4020 is a new register. Different game cabinets change whether the left or right player's controls are connected to $4016 and $4017.[2] The 2C05 swaps PPUCTRL and PPUMASK. Otherwise, all registers have the same meanings as on the NES or PlayChoice.
7 bit 0 ---- ---- xxxx xCRS ||| ||+- 1 then 0: Request a report from the joysticks or Zapper |+-- In the DualSystem, does two things: | #1: Used to request an IRQ on the other CPU (if its interrupts are enabled). | When 0: asserts an IRQ request. | When 1: releases the IRQ request. | #2: On the primary CPU only, controls which CPU can access 2 KiB of shared RAM mapped in the $6000-$7FFF region. | When 1: the primary CPU has access and the secondary CPU sees open bus. | When 0: the secondary CPU has access and the primary CPU sees open bus. | The secondary CPU has no direct control over access. +--- 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.
VS Super Mario Bros. requires dedicated exclusive access to the shared memory. The bundled RP2A04 is nothing but a jumper that ties the primary socket's OUT1 pin to ground. This means that Vs. SMB can't use IRQs, because its CPU's /IRQ pin is always asserted.
7 bit 0 ---- ---- PCCD DS0B |||| |||| |||| |||+- Buttons for player 2 (A, B, 1, 3, Up, Down, Left, Right) |||| ||+-- always 0 (from floating input on 74LS240) |||| |+--- Service button (commonly inserts a credit) |||+-+---- DIP switches "2" and "1", respectively |++------- Coin inserted (read below) +--------- 0: Game is running on the primary CPU (it controls which CPU has access to shared RAM) 1: Game is running on the secondary CPU (it must prevent watchdog timer timeout)
The "coin inserted" signals are the contact switches in the coin acceptors. The default UniSystem harness wiring connects both coin acceptors in parallel, and only to the $20s bit, so that bit is the only one of the two that goes high when a coin is inserted in either acceptor. However, games MUST check both bits because the coin acceptors could have been connected independently. Some games refuse to grant a credit if the "coin inserted" signal is true for too long, to protect against malicious arcade-goers.
The coin collectors will read as true for approximately 40 to 70ms. A game should check the registers at least every other NMI to be assured of not eating the player's coins.
The service button is debounced with an RC network: after the button is released, it should take somewhere between 3 to 6 milliseconds until it reads as false. After the capacitor has been fully charged, it should take between 1 and 1.4 milliseconds until it reads as true. The game need not poll the service button with any frequency, since the button can be held by the arcade operator for an arbitrary amount of time.
Games may, and even probably should, parse the two "coin inserted" bits independently: emulators should NOT set both bits high when a single virtual coin has been inserted. For example, VS Super Mario Bros. gives 2 credits if both coin bits are set.
Unlike previous advice, it is not necessary to acknowledge a coin insert by driving the coin counter, but the arcade operator would be cross if the game didn't!
7 bit 0 ---- ---- DDDD DD0B |||| |||| |||| |||+- Buttons for player 1 (A, B, 2, 4, Up, Down, Left, Right) |||| ||+-- always 0 (from floating input on 74LS240) ++++-++--- More DIP switches ("8" down to "3")
The secondary CPU must be present in socket 8J and it must be instructed to read from $4017 at least every 1.2 seconds, or else the watchdog timer will reset both CPUs, both PPUs, and both CPUs' bit at $4020.
The game is expected to keep track of the total number of coins inserted by toggling this line every time a coin is seen while reading $4016.
15 address 4 0 7 bit 0 ---- ---- ---- ---- ---- ---- 010x xxxA xx1x xxxx xxxx xxxC | | | +- (write) 1, delay, 0: Increment coin counter +---------------------- (read) Same as write, but see below
The port is mirrored across the entire range of $4020-$5FFF and may interfere with mappers that put ports, ROM, or RAM in this range. When the latched value is 1, it drives an electromagnet in the coin counter. Writing 1 then 0 will increment the counter. The electromagnetic counter can vary from machine to machine, but the least common denominator is a 10Hz DC coin counter: driving the signal high for 50ms (3 vblanks) and then low for 50ms is guaranteed to work. Some counters may be able to be driven faster: one requires as little as 16ms high and 22ms low. This register is explicitly cleared on powerup and reset.
Reading from the register effectively writes the value of open bus. No games use any of this bit's mirrors, or try to read from it.
The games released for the Vs. System mostly relied on the variety of PPUs to prevent copyright infringement. A few third-party games added an extra IC as well; the three known games with this additional protection were used with Namco's 108.
The hardware used by games released during the Vs. System's commercial life is equivalent to the following mappers: