Identity and evidence precedence
This is the Bally WPC-95 physical product released 1997. It covers the cv_* clone tree: cv_14 (catalog parent, 1.4), cv_10, cv_11, cv_13 (earlier firmware), cv_20h/cv_20hc (later "Home"/"Home, Coin Play" firmware), and cv_d52 (prototype, undumped sound ROMs). Every one of these is a game-ROM revision for the same physical machine; cvGameData is the one static struct all seven share.
Evidence precedence for this definition: the retained known-working VPW Mod v1.0 script is runtime and mechanism-causality ground truth; the Bally operations manual controls physical construction, part numbers, wiring, polarity, quantities, and device presence; pinned PinMAME controls controller generation, public address topology, and mechanism-table hints; the retained VPX geometry supplies normalized coordinates. Unlike several other WPC-95 games curated in this project, Cirqus Voltaire's driver source (src/wpc/sims/wpc/prelim/cv.c) is explicitly a preliminary simulator whose own cv_ringMech mechanism table models the Ringmaster over a different position range and a different solenoid alias than the retained script and manual agree on; see "The Ringmaster mechanism" below for how that disagreement is resolved by evidence priority rather than silently averaged.
GEN_WPC95 (PINMAME_HARDWARE_GEN_WPC95 = 0x80) with wpc_dispDMD. The controller profile is pinmame.wpc-95, reused unchanged (confirmed directly from cvGameData's own field, not assumed from the machine's release year).
- Switches: dedicated coin-door 1-8, matrix 11-88 as drive column then return row, Fliptronic 111-118.
cvGameData's inverted-switch mask {0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} inverts only column 3 bits 0-5 (31-36), but the printed switch matrix (2-49) shades the entire column 3 -- all eight rows, 31 through 38 -- "OPTO, TYPICALLY CLOSED". The mask's bits 6-7 (37, 38) are clear; see the unresolved polarity conflict below.
- Solenoids: physical drivers 1-16; flashers 17-21, 23-28 (22 shares the flasher address block but is a motor-enable line, not a flashlamp); Fliptronic upper-flipper-slot circuits 33-36 (all four repurposed to non-flipper devices -- Popper, Diverter Hold, Ringmaster Magnet, Upper Post -- since this machine has no upper flippers); WPC-95 LPDC motor-circuit output 37 (Neon) and 39 (Motor Direction), with PinMAME's backward-compatibility mirror of 39 at 43; 38 is unfitted and 40 (Eddy Board) is a Low Power motor-circuit entry, not itself an LPDC output; Fliptronic lower-flipper circuits 45-48; PinMAME state channels 29-32; two driver-declared custom solenoids 51/52 (
hw.custSol = 2); simulator-only 49 and reserved 50.
- Lamps: 8x8 matrix 11-88, all addresses populated (88, Start Button, is a real bulb the retained table simply does not render -- see "Lamps, flashers, and general illumination").
- GI: five strings on public addresses 0-4, only 0-2 driven by the retained script.
Two WPC-95 numbering facts must not be lost. First, the printed solenoid table numbers the lower-flipper circuits 29-32, while PinMAME publishes the same circuits at 45-48 (a +16 offset, CORE_FIRSTLFLIPSOL = 45); the manual numbers are preserved as manual.address aliases. Second, the printed upper-flipper-slot circuits 33-36 equal their public address unchanged (CORE_FIRSTUFLIPSOL = 33) but are all four repurposed -- Cirqus Voltaire has no upper flippers, matching cvGameData's FLIP_SOL(FLIP_L) (lower flippers only; FLIP_SW(FLIP_L|FLIP_U) still tells WPC-95 to read the whole eight-position Fliptronic switch column, which is a separate fact from whether upper coils exist).
The Ringmaster mechanism
A DC gearmotor (A-21953 Ring Master Assembly, drive part A-15680) raises and lowers the Ringmaster figure. The retained script's cvpmMech class (mechRM) configures it with Sol1 = 22 (motor pulse), Sol2 = 39 (direction), a 0-118 position counter (Length = 960, Steps = 118), and three switch bands: AddSw 44, 0, 1 (Ringmaster Down, retracted, Ringmaster.z = -310), AddSw 43, 88, 89 (Ringmaster Middle), and AddSw 42, 117, 118 (Ringmaster Up, near the playfield surface, Ringmaster.z = -56). Sub UpdateRM steps a chain of 22 collision-wall objects (RMWall0..RMWall255) as the head rises, so a ball can only strike it while it protrudes, and enables switch 16 (Top Eddy, the A-20036 "Magic Eddy Coil PCB") only while the head is out of its home position (RMCurrPos > 4 and RMCurrPos < 100). A separate collision object, RMHitWallSMall, becomes collidable once RMCurrPos > 17 and its RMHit_Hit handler pulses switch 38 (Top Targets) -- so switch 38 registers hits on the raised Ringmaster figure as well as its own two printed standup targets (see "'WOW' and Top target banks" below).
Pinned PinMAME's own preliminary cv_ringMech table (src/wpc/sims/wpc/prelim/cv.c) models the same three switches differently: a shorter 0-127 range, a different position-to-switch ordering ({42,0,4},{43,33,38},{44,123,127}), and sol2 = 43 rather than 39. That last difference is not a real disagreement: PinMAME's core_getSol duplicates WPC-95 LPDC outputs 37-40 at mirror addresses 41-44 (solNo 41-44 read back at solNo - 4), so public address 43 mirrors public address 39 -- both name the identical physical drive line, and this manual's own "MOTOR DIRECTION" label for solenoid 39 confirms it directly. The retained known-working script and this manual are treated as authoritative for the mechanism's runtime position-to-switch mapping over the preliminary driver's own scaffolding, consistent with the project's evidence-priority policy (known-working script for runtime semantics; pinned PinMAME source is a supporting reference, not an override, when its own file header reads *** PRELIMINARY ***).
Solenoid 35 (Ringmaster Magnet) energizes a magnet at the head that catches a ball in flight; on release the retained script computes a randomized kick angle and velocity and fires the ball off the magnet after a scripted delay, rather than a plain drop. Service Bulletin 102 (1997-12-09) documents a factory lubrication procedure for "the Ringmaster Cam & Switch Assembly on the back of the Ringmaster bracket", independently confirming the mechanism is cam-and-switch driven.
Ball path, trough, and popper
Cirqus Voltaire has an auto-plunger, not a manual plunger: solenoid 1 launches a ball resting on shooter-lane switch 18. Four balls rest on trough optos 32-35, tracked by the retained script's cvpmBallStack class (bsTrough); solenoid 9 ejects the ball at the head of the trough and pulses trough-eject opto 31 in the same event (SolRelease: vpmTimer.PulseSw 31), so switch 31 is a documented projection onto the trough's own exit kicker (BallRelease) rather than a separately placed object, matching switches 32-35. A ball resting on opto 36 (Popper Opto) is kicked back to the playfield by solenoid 33 (Popper), printed on the upper-flipper Fliptronic slot rather than the standard 1-16 solenoid range.
Trough optos 31-36 are printed optos that rest closed and PinMAME's cvGameData inverted-switch mask covers exactly those six: assert the public switch when a ball is present and never invert again.
"WOW" and Top target banks: recorded opto polarity conflict
Two target banks share one electrical address each: three standup targets (assembly A-21960-6, retained table objects T37a/T37b/T37c) on switch 37 ("WOW" Targets), and two standup targets (assembly A-18530-6, T38a/T38b) on switch 38 (Top Targets, which additionally registers Ringmaster hits -- see above). Both are printed with no separate switch part number, the same signature pattern as the trough optos, and both are shaded "OPTO, TYPICALLY CLOSED" on the printed switch matrix -- the shading covers the whole column 3, all eight rows, not just 31-36.
Unresolved polarity conflict (conflict.wow-top-targets-opto-not-normalized): cvGameData's inverted-switch mask ({0x00,0x00,0x00,0x3f,0x00,...}) covers only bits 0-5 of column 3 (31-36); bits 6-7 (37, 38) are clear. Unlike Williams Monster Bash's Dracula-position conflict, there is no mechanism table on the PinMAME side asserting an opposite sense for these two addresses -- the mask is simply silent on them -- so this conflict is narrower in scope but no less unresolved. Resolving it needs a LibPinMAME harness trace of a legal cv_20h or cv_14 ROM observing the idle public state of 37/38 and their transitions when a target is hit.
Left/right magnets, diverter, upper post, and lock
Solenoid 3 (Left Loop Magnet) and solenoid 5 (Ramp Magnet) are two independent grab-and-release magnets, each configured through the retained script's cvpmMagnet class via its own .Solenoid property rather than an explicit SolCallback line -- two commented-out SolCallback(3)/SolCallback(5) lines earlier in the script are vestigial from an older authoring approach the class-based binding superseded. Switch 64 (Ramp Magnet) senses a ball at the same location solenoid 5 catches it.
Solenoid 6 (Diverter Power) and solenoid 34 (Diverter Hold) drive one right-orbit diverter flap; the retained script registers no callback for solenoid 6 alone, consistent with 6 being the brief power pulse that moves the flap and 34 the continuous hold that keeps it there. Solenoid 36 (Upper Post) raises and lowers a single post near the top of the playfield with no dedicated switch. A vertical three-position lock on the Center Wire ramp (A-21851) holds up to three balls at switches 66/67/68 (Ramp Lock Low/Middle/High), released by solenoid 16 (Lock Post); Service Bulletin 104 (1998-04-02) independently documents an adjustment for these same three switches by part number (5647-12693-66), confirming both the construction and the three-switch topology transcribed from the switch-locations list.
Disappearing jet bumper
Assembly A-21564 ("Disappear Jet Bump Assembly") raises the middle jet bumper into play (solenoid 7, Jet Up) and releases/lowers it (solenoid 8, Jet Release); solenoid 4 (Middle Jet Bumper) is the same assembly's own thump coil, and switch 54 senses a hit. This is distinct from the two fixed jet bumpers at switches 53/55 (solenoids 12/13). Service Bulletin 101 (1997-12-09) documents a factory quality-assurance fix for the first 200 production samples: a brass release latch installed backwards and a release-coil frame that could bend, both correctable with an added bracket (p/n 01-14803) -- concrete, dated confirmation that this "disappearing" mechanism is real hardware, not merely a scripted visual effect.
Backbox prize wheel and bell
Solenoid 2 (Backbox Kick) launches a ball into a backbox spinning-wheel/bell toy; the retained script randomly selects one of four wheel-spin cases, each ending with a timer that pulses switch 11 (Backbox Luck) and plays a bell sound. Both the trigger switch and the kicker sit in the retained table's separate backbox visual coordinate space (large negative x), not on the physical playfield, and are recorded with a controlled cabinet_or_service spatial record rather than a fabricated playfield position.
Fliptronic column: flippers, spinners, and eddy-current sensors
Two Fliptronic flippers on circuits 111-114 (lower right/left, EOS then button-opto, A-14876-R right and A-15849-L left). There are no upper flippers, but unlike a simple "unfitted" pattern, positions 115 and 117 (the upper EOS slots) are repurposed for a pair of free-spinning targets: F5 (public 115) is the Right Spinner and F7 (public 117) is the Left Spinner, both confirmed by the retained script's own sw115spinner_Spin/sw117spinner_Spin handlers and by the retained table's own geometry (sw115spinner at normalized x=0.824, right side; sw117spinner at x=0.090, left side). A prior legacy-migrated record had these two switches' left/right labels reversed ("Left Spinner" at 115, "Right Spinner" at 117); this manual's own printed F5/F7 labels and the table geometry both independently agree and correct it, the same class of correction already established for other WPC games in this project (e.g. Twilight Zone's slingshot labels).
Positions 116 and 118 (the upper button-opto slots) are genuinely unfitted -- the switch-locations parts list marks both assembly and switch part "NOT USED" -- but the switch-matrix wiring page nonetheless shades them as opto positions with real printed wire colors and J212 connector pins, matching the fitted lower-flipper button-opto template. This is the WPC-95 CPU board's own generic Fliptronic circuit, present on the board hardware whether or not a given machine populates it, the same resolution already established for Williams Monster Bash's own unfitted F6/F8 positions.
Four A-18008-1 eddy-current proximity sensors (part A-16443) at switches 17 (Right Inlane), 26 (Left Inlane), 75 ("Volt" Right), and 76 ("Volt" Left) detect a ball without a mechanical contact switch. The retained script ties each of the four switches to one of four volt1..volt4 table objects (sw17_Hit sets Volt3.Z, sw26_Hit sets Volt4.Z, sw75_Hit sets Volt2.Z, sw76_Hit sets Volt1.Z), and UpdateLamps ties the same four objects to lamps 85, 77, 87, and 86 respectively (imgswapm/DisableLightingm) -- so each eddy sensor and its matching insert lamp illuminate one shared physical "Volt" location, independently confirmed on both the switch and lamp sides of the retained script.
Lamps, flashers, and general illumination
All 64 lamp-matrix addresses are populated. Lamp 88 (Start Button) shares its assembly part number (20-9663-16) with switch 13's own Start Button assembly, confirming it is a real cabinet bulb, but the retained VPX table's UpdateLamps routine has both of its Lampm 88, l88/l88b calls commented out, so no Light object models it in this extraction; it is still recorded used with a controlled cabinet_or_service spatial record and the gap is disclosed in physical.notes. Every other address has a co-located l##/l##b render-doubling pair; only the primary object's coordinate is used.
General illumination splits three ways on the retained script's UpdateGI dispatch, which handles only Case 0/1/2: GI address 0 (Playfield Right) drives 11 Light objects, address 1 (Playfield Middle) drives 9, and address 2 (Playfield Left) drives 11 -- each collection's own large overlay-shape helper (GIRight/GiCenter/GILeft, a Flasher-type object with no discrete center) is excluded as a table-modeling render helper, not a distinct physical bulb. GI addresses 3 and 4 are backbox insert-panel strings the printed manual marks "always on" (do not brighten/dim); UpdateGI never dispatches them, so they take a controlled cabinet_or_service record. The manual disagrees with itself about which of the two is "Backbox 1" and which is "Backbox 2": the primary combined wiring table (printed 2-50, which carries the J106/J104 connector numbers) prints item 04 as "Backbox 2" and item 05 as "Backbox 1", while the separate Solenoid/Flashlamp Locations list (printed 2-46, no connector data) prints the same two items the other way round. This definition uses the connector-carrying wiring table's labels and records the disagreement itself as conflict.gi-backbox-string-numbering; it does not affect either string's spatial disposition, since neither has a playfield coordinate regardless.
Solenoid 27 (Ringmaster Flashers) is the one flasher circuit the manual explicitly quantifies at two bulbs, but the retained table models both with a single large polygon Flasher shape (f127, light-mapped to l127) draped over the Ringmaster area rather than as two separately placed bulb objects. The recorded placement is that shape's own drag-point centroid, not two distinct bulbs; the shape's own light-map object (l127) sits at an anomalous stray coordinate far from the shape and is excluded as a table-modeling anomaly. Two solenoid-driven mechanisms (Diverter Power/Hold at raw normalized x=1.06-1.07, Neon's NeonBase object at x=1.08) sit just past the retained table's own declared right edge (bounds left=0 top=0 right=964 bottom=2162); each is clamped to x=1.000000 with the raw offset disclosed rather than fabricating a different coordinate, the same precedent established by Williams Monster Bash's GIbot exclusion and by other curated games' clamped header lamps. Solenoid 22 (Motor Enable) is printed inside the flasher address block (17-28) and wired through a driver transistor the same way a flasher is, but its part number (A-15680) is a DC gearmotor part shared with solenoid 39 (Motor Direction), and the retained script's MotorEnable sub only starts/stops a motor sound -- it is the Ringmaster motor's continuous enable line, not a flashlamp.
Custom solenoids 51/52: a driver-declared decaying state, not a device
cvGameData declares hw.custSol = 2, publishing two addresses at CORE_CUSTSOLNO(1) = 51 and CORE_CUSTSOLNO(2) = 52. The driver's own preliminary cv_getSol handler answers them from locals.sol35/locals.sol36, a pair of counters that jump to 10 whenever the real public solenoids 35 (Ringmaster Magnet) and 36 (Upper Post) fire and decay by one each VBLANK otherwise -- a synthetic afterglow for the *** PRELIMINARY *** ball simulator's own attract-mode animation, not a distinct physical device. Both are recorded virtual with a virtual spatial record; solenoids 35 and 36 are the real control lines.
Author construction checklist
- Build the four-ball trough with the auto-plunger shooter lane, the rising/rotating Ringmaster with its magnet catcher and raised-position hit wall, the left loop and ramp ball-catch magnets, the right-orbit diverter, the upper post, the three-position ramp lock, both saucers, the popper, the disappearing middle jet bumper plus the two fixed jet bumpers, both slingshots, the "WOW" and Top target banks, the left/right spinners, the backbox prize wheel and bell, and the neon ramp.
- Preserve opto polarity for 31-36; do not invert what PinMAME already normalizes. Switches 37 and 38 are also printed normally-closed optos on the same shaded matrix column, but PinMAME does not normalize them -- treat their polarity as unresolved (
conflict.wow-top-targets-opto-not-normalized) rather than assuming either convention.
- Treat WPC-95 LPDC output 39 and its PinMAME mirror 43 as one physical Ringmaster-direction drive line, not two devices.
- Bind every dedicated switch 1-8, every matrix position 11-88 including the printed Not Used positions, Fliptronic 111-118 with 116/118 explicitly not installed and 115/117 repurposed as the right/left spinners (not the reverse), the eight CPU DIP bits, solenoids 1-52 including the two driver-declared decaying-state custom addresses, lamps 11-88, GI 0-4, and the 128x32 DMD.
- Do not label public solenoid 22 a flashlamp; it is the Ringmaster motor's continuous enable line despite sitting in the printed flasher address block.
Sources
manual.bally.cirqus-voltaire.1997: Bally Cirqus Voltaire operations manual, SHA-256 14cb9a4a225a7f5e6b9ea8b3f81b8626f3307cf299c4420d34612d42367a0eec.
- Service Bulletins 101, 102, and 104 (separate retained PDFs): disappearing-jet-bumper fix, upgrade kit, and adjustment sheet.
vpx-script.cv-vpw-1-0: retained known-working VPW Mod v1.0 embedded script, SHA-256 2abdca0fb8870c995314c52d5e3931530f6c850b1c8ac5f11176aca58b87bfa4, binding cv_20h.
vpx-table.cv-vpw-1-0: retained VPW Mod v1.0 table, SHA-256 7aab0f175816f7bdee4114d5859cbfc70760aead8ef39ebf6481609b649207e5.
pinmame.core.4ec52ff0ac13: src/wpc/sims/wpc/prelim/cv.c, pinned revision 4ec52ff0ac133ac251681518aed2249e19fe26eb.