Capcom CC

pinmame.capcom

controllers/pinmame/capcom.json
6
Machines
1
Author ready
3
Address groups

Polarity is already normalised

PinMAME reports logical active state on this platform. A consumer must not invert again. Whether a real switch is normally closed stays recorded per device as a physical fact, so a recreation can build the right hardware without changing what the emulator reports.

Address groups

Cabinet, playfield, and synthetic flipper switch addresses

pinmame.input.switch

Switch
Legal addresses
  • 1 … 1616 slots
  • 17 … 8064 slots
  • 81 … 888 slots
  • 89 … 968 slots
Transports
  • libpinmamechannel=switch
Technical details for Cabinet, playfield, and synthetic flipper switch addressesSource-derived address behavior and exceptions

Every cc driver overrides the platform default with MDRV_SWITCH_CONV(cc_sw2m, cc_m2sw) in src/wpc/capcom.c's MACHINE_DRIVER_START(cc). This profile therefore follows cc_sw2m/cc_m2sw exactly, rather than the sequential core_swSeq2m mapping used by generations without an override.

cc_m2sw(col, row) maps the internal matrix as follows:

Internal column Public address Purpose
0-8 9 + row + col * 8 Public 9-80
9 1 + row Public 1-8
10 89 + row Public 89-96
Any other column (11 in practice) 81 + row Public 81-88
  • 1-8 -- cabinet inputs. Internal column 9 is the first CC_COMPORTS cabinet byte (src/wpc/capcom.h): Coin 1-4 at 1-4, Start Game at 7, and the toggle-style Coin Door input at 8. Addresses 5 and 6 are excluded from CORE_SETKEYSW by SWITCH_UPDATE(cc)'s 0xcf mask because FLIP_SWNO(5,6) (src/wpc/capgames.c #define FLIP) reserves them for the two physical flipper buttons.
  • 9-16 -- second cabinet byte. Internal column 0 supplies Slam Tilt at 9, Tilt at 10, Buy In at 11, unused positions at 12-15, and a fifth unused position at 16. CC_COMPORTS places this second byte in internal switch column 0 (src/wpc/capcom.h), decoded separately from the column-9 byte above. Together, 1-16 are the 16 cabinet switches described by the driver header. SWITCH_UPDATE(cc) writes this byte to internal column 0 only when HAS_SWITCH_BOARD is true (hw.lampCol > 1). Breakshot's single-lamp-matrix mode instead shifts its low nibble (bits 0-3) into internal column 2 bits 4-7, so Slam Tilt, Tilt, Buy In, and the unused fourth bit surface at public addresses 29-32.
  • 17-80 -- playfield switches. When HAS_SWITCH_BOARD is true, internal columns 1-8 are the 64 external-board switches. The io_r handler at 0x200008-0x20000b reads two decoded bytes from coreGlobals.swMatrix[swcol+4] and [swcol], inverts the hardware state as documented by the driver's 'Switches are inverted' comment, and exposes the normalized result through this range. Breakshot has no external switch board; its single-lamp-matrix hardware instead reads the same public range through the lamp-column-strobed switch matrix.
  • 81-88 -- synthetic flipper and EOS state. Internal column 11 (CORE_FLIPPERSWCOL, src/wpc/core.h) is fabricated by core_updateSw (src/wpc/core.c). Which bits can become live depends on the game's own hw.flippers declaration, including FLIP_SW()/FLIP_EOS(), and the FLIP_SWL/FLIP_SWR macros used to build locals.flipMask. These addresses have no corresponding printed Capcom circuit. A game without physical upper-flipper buttons populates only the lower-flipper bits 81-84 plus the EOS bits implied by its FLIP_SOL() declaration.
  • 89-96 -- unused core allocation. Internal column 10 exists because CORE_STDSWCOLS (src/wpc/core.h) reserves 12 columns for every generation. No cc driver reads or writes it, so this range is permanently zero rather than a physical cabinet or matrix column.

Solenoids, flashers, motors, and Fast Flips state

pinmame.output.solenoid

Solenoid
Legal addresses
  • 1 … 3232 slots
  • 33 … 5018 slots
  • 511 slot
Transports
  • libpinmamechannel=solenoid
Technical details for Solenoids, flashers, motors, and Fast Flips stateSource-derived address behavior and exceptions

Physical outputs

Addresses 1-32 are the 32 real driver-board outputs (src/wpc/capcom.c's header documents 'Solenoids = 32 Solenoids/Flashers'). The io_w handlers at 0x20000c and 0x20000d write two 16-bit words covering 1-8/17-24 and 9-16/25-32 through core_write_pwm_output_8b.

MACHINE_INIT(cc) in src/wpc/capcom.c assigns the bulb-driver type per root game:

Root prefix Game Flasher outputs
abv Airborne 20-27
bbb Big Bang Bar 21-26
bsv Breakshot 28-32
ffv Flipper Football 28-32
kpb Kingpin 18-19, 21-31
pmv Pinball Magic 21-31

Breakshot's production branch keeps the center-pocket range at 28-32; the source comments out an alternative plunger range at 27-31 because it appeared in documentation but was not kept in production. Kingpin's two ranges are explicitly provisional in the source: they came from a VPX table because no manual was found.

The selected ranges use CORE_MODOUT_BULB_89_20V_DC_WPC; addresses outside the range selected by the game's own strncasecmp(gn,...) branch default to ordinary two-state coil or motor drivers. Never assume one fixed flasher range for the whole family.

Legacy flipper mirrors

Addresses 33-44 are the platform's Fliptronic-shaped upper-flipper range (CORE_FIRSTUFLIPSOL = 33), and 45-48 are the synthetic lower-flipper range (CORE_FIRSTLFLIPSOL = 45, both in src/wpc/core.h). The io_w handler for physical solenoids 9-16 mirrors four circuits with core_write_pwm_output(CORE_MODOUT_SOL0+sLRFlipPow-1,...) (and the corresponding sLLFlipPow, sURFlipPow, and sULFlipPow indices) for compatibility with old DOF configurations:

Physical address Legacy mirror PinMAME mirror name
9 45 sLRFlipPow
10 47 sLLFlipPow
11 33 sURFlipPow
12 35 sULFlipPow

Treat 9-12 as the physical, manual-documented circuits and 33/35/45/47 as backward-compatibility duplicates with no device of their own. The driver explains the compatibility hack verbatim:

This should be removed as this push the legacy PinMAME specific mapping forward while it does not correspond to manuals or any other reference

System using this driver must use the native output 8..11. But as it breaks existing DOF config, we still maintain this hack for the sake of backward compatibility.

Here 8..11 are zero-based PWM output indices, so the corresponding public physical addresses are 9-12. The WPC-derived left/right names are not proof of a particular game's wiring; check that game's manual and known-working script.

The rest of the shaped ranges are dead slots: 34, 36, 37-44, 46, and 48 receive no PWM write from any cc driver and remain zero. In particular, Capcom does not implement WPC's LPDC duplication at 37-44.

Reserved and custom state

  • 49-50 are unused platform gaps. They mirror the platform-wide CORE_FIRSTSIMSOL = 49/reserved-50 convention, but the cc driver does not reference either address.
  • 51 is optional synthetic Fast Flips state, not a driver-board circuit. CORE_FIRSTCUSTSOL = 51 and CORE_MODOUT_SOL_CUSTOM define the slot (src/wpc/core.h). It exists only for games declared with INITGAMEFF (src/wpc/capgames.c), where hw.custSol = 1 and the game's name##_getsol callback reads a game-on/game-off flag from ROM or RAM. Since coreGlobals.nSolenoids = CORE_FIRSTCUSTSOL - 1 + hw.custSol, a game declared with plain INITGAME has hw.custSol = 0 and publishes no address 51.

CPU-controlled lamp outputs and diagnostic LEDs (no separate general-illumination channel)

pinmame.output.lamp

Lamp
Legal addresses
  • 1 … 136136 slots
Transports
  • libpinmamechannel=lamp
Technical details for CPU-controlled lamp outputs and diagnostic LEDs (no separate general-illumination channel)Source-derived address behavior and exceptions

The cc/cc1/cc2 driver family uses coreGlobals.nLamps = 64 + (hw.lampCol * 8) in src/wpc/capcom.c's MACHINE_INIT(cc). A machine definition must narrow the platform-wide 1-136 ceiling to the game's own hw.lampCol declaration.

  • Matrix A occupies public addresses 1-64 when fitted.
  • Matrix B starts at ((hw.lampCol - 1) * 8) + 1: address 65 when hw.lampCol = 9, address 57 for Flipper Football 1.03 with hw.lampCol = 8, and address 1 for Breakshot with hw.lampCol = 1.
  • The final eight published addresses are diagnostic allocation. The first two report the CPU- and sound-board LEDs; the remaining six are unused.

Most games have an external switch board and two lamp matrices. Breakshot is a supported hardware mode in the same cc family, but uses hw.lampCol = 1: it has no external switch board, has one physical lamp matrix, and reuses the other lamp-matrix circuitry to strobe switches. This is the distinction expressed by HAS_SWITCH_BOARD = core_gameData->hw.lampCol > 1.

The largest family declaration is hw.lampCol = 9, making 136 the exact platform ceiling, not 200. There is no separate general-illumination channel; every fitted bulb is CPU-controlled and belongs to the lamp group.

Evidence

  • Reference

    https://github.com/vpinball/pinmame

    Source locations

    src/wpc/capcom.c (file header hardware/lamp/switch/solenoid comment; cc_vblank/SWITCH_UPDATE(cc)/cc_zeroCross/io_r/io_w/MACHINE_INIT(cc)/cc_sw2m/cc_m2sw/MACHINE_DRIVER_START(cc/cc1/cc2); MACHINE_DRIVER_START(romstar) inspected only to establish that the unrelated Goofy Hoops driver is outside this profile); src/wpc/capcom.h (CC_COMPORTS, CC_INPUT_PORTS_START, CC_ROMSTART_2/4/8/2X macros); src/wpc/capgames.c (capInvSw0-13 per-game inverted-switch masks, #define FLIP FLIP_SWNO(5,6)+FLIP_SOL(FLIP_LL|FLIP_LR|FLIP_UR|FLIP_UL), INITGAME/INITGAMEFF macros and their core_tGameData positional field order, cc_dispDMD128x32/cc_dispDMD256x64, every cc-family CORE_GAMEDEFNV/CORE_CLONEDEFNV entry); src/wpc/core.h (core_tGameData hw struct field order: flippers/swCol/lampCol/custSol/soundBoard/display/gameSpecific1/gameSpecific2/getSol; CORE_FIRSTUFLIPSOL=33, CORE_FIRSTLFLIPSOL=45, CORE_FIRSTCUSTSOL=51, CORE_CUSTSOLNO, CORE_MAXSWCOL=16, CORE_STDSWCOLS=12, CORE_FLIPPERSWCOL=11, CORE_SWLRFLIPEOSBIT/CORE_SWLRFLIPBUTBIT/CORE_SWLLFLIPEOSBIT/CORE_SWLLFLIPBUTBIT/CORE_SWURFLIPEOSBIT/CORE_SWURFLIPBUTBIT/CORE_SWULFLIPEOSBIT/CORE_SWULFLIPBUTBIT bit values, FLIP_LR/FLIP_LL/FLIP_UR/FLIP_UL/FLIP_L/FLIP_U/FLIP_SW/FLIP_SWNO/FLIP_SOL/FLIP_EOS/FLIP_BUT/FLIP_SWL/FLIP_SWR macros, sLRFlip/sLRFlipPow/sLLFlip/sLLFlipPow/sURFlip/sURFlipPow/sULFlip/sULFlipPow); src/wpc/core.c (core_updateSw flipMask construction and synthetic flipper switch/EOS handling at locals.flipMask/CORE_FLIPPERSWCOL, core_getSw/core_setSw generic invSw application via coreGlobals.invSw[swNo/8], core_gameData->wpc.invSw copied into coreGlobals.invSw at game init); src/libpinmame/libpinmame.h (PINMAME_HARDWARE_GEN enum: no Capcom/cc entry exists anywhere in this enum, confirmed by its absence and by core_tGameData's own gen field being the literal 0 in every cc-family INITGAME/INITGAMEFF expansion, so PinmameGetHardwareGen() reports 0 for every Capcom game; this profile's hardware_family is identified by MACHINE_DRIVER_START(cc)/driver short-name prefix, not by a hardware-generation bitmask, unlike every WPC/System-11/Whitestar/SAM profile in this repository)

    rev
    4ec52ff0ac13

Something wrong or missing?

Address ranges, transports and normalisation rules live in one profile file. If PinMAME exposes a group this profile does not describe — or describes wrongly — the fix belongs there.

Cite a source for anything you change — a manual page, a line in a working VPX script, PinMAME source, or a reading from the machine's own service menu. Claims without provenance cannot be validated.

Machines on this platform

All 6 machines