Overview
Legacy evidence identifies this candidate as Bally (1981). The information below is preserved for recreation work but is not automatically treated as validated physical-machine fact.
Playfield devices
Switch, lamp/GI, and controlled-device candidates are in the adjacent machine definition. Source-specific implementation notes are retained below.
Custom mechanisms
No custom mechanism conclusion has been validated. Manuals, schematics, PinMAME source, and gameplay evidence still need to be checked.
Ball-state transitions
Ball paths, trough ordering, locks, kickouts, and causal transitions have not yet been normalized. Relevant source notes follow under Evidence notes.
Controller interactions
Controller callbacks and bindings are candidate evidence only until reconciled against PinMAME and physical documentation.
Service and setup information
Unknown; locate operator/service documentation.
Timing and tuning observations
Source timing values may describe a particular VPX implementation rather than physical hardware and require review.
Recreation guidance
Do not treat this partial definition as a complete authoring specification. Resolve every coverage requirement and conflict before promotion.
Evidence notes
platforms/bally.json#/coils/1: Unbound legacy outputs recordc_flipper_lower_rightwas retained as a migration note only.platforms/bally.json#/coils/2: Unbound legacy outputs recordc_flipper_lower_leftwas retained as a migration note only.platforms/bally.json#/coils/3: Unbound legacy outputs recordc_flipper_upper_rightwas retained as a migration note only.platforms/bally.json#/coils/4: Unbound legacy outputs recordc_flipper_upper_leftwas retained as a migration note only.games/spectrum.json#/switches/0._note: Controller.Switch(1) set via RightFlipperKey in Table1_KeyDown/KeyUpgames/spectrum.json#/switches/1._note: Controller.Switch(2) set via LeftFlipperKey in Table1_KeyDown/KeyUpgames/spectrum.json#/switches/2._note: Controller.Switch(7) on/off. Dual-direction kick: sol 1 kicks left, sol 2 kicks right.games/spectrum.json#/switches/3._note: bsD cvpmBallStack. InitSaucer Drain, 8. Single ball drain — early Bally has no multi-switch trough.games/spectrum.json#/switches/4._note: vpmNudge.TiltSwitch = 15games/spectrum.json#/switches/5._note: Controller.Switch(17) on/off. Dual-direction kick: sol 3 kicks left, sol 4 kicks right (inferred from sub pairing).games/spectrum.json#/switches/6._note: Controller.Switch on/offgames/spectrum.json#/switches/7._note: Controller.Switch on/off. Multiple VPX objects: sw19, sw19a, sw19bgames/spectrum.json#/switches/8._note: Controller.Switch on/offgames/spectrum.json#/switches/9._note: Controller.Switch on/off. Multiple VPX objects: sw21, sw21a, sw21bgames/spectrum.json#/switches/10._note: Controller.Switch on/offgames/spectrum.json#/switches/11._note: Controller.Switch on/offgames/spectrum.json#/switches/12._note: Controller.Switch(24) on/off. Dual-direction kick similar to sw7/sw17.games/spectrum.json#/switches/13._note: Controller.Switch on/off. Multiple VPX objects: sw25a, sw25b, sw25c — all map to switch 25games/spectrum.json#/switches/14._note: vpmTimer.PulseSw 26games/spectrum.json#/switches/15._note: Controller.Switch on/offgames/spectrum.json#/switches/16._note: Controller.Switch on/offgames/spectrum.json#/switches/17._note: Controller.Switch on/offgames/spectrum.json#/switches/18._note: Controller.Switch on/offgames/spectrum.json#/switches/19._note: vpmTimer.PulseSw 31games/spectrum.json#/switches/20._note: Controller.Switch on/off. Multiple VPX objects: sw32a, sw32b, sw32c — all map to switch 32games/spectrum.json#/switches/21._note: Controller.Switch on/off. Multiple VPX objects: sw33, sw33agames/spectrum.json#/switches/22._note: DTHit 34. Reset by sol 11 (DT_G_Reset).games/spectrum.json#/switches/23._note: DTHit 35. Reset by sol 11 (DT_G_Reset).games/spectrum.json#/switches/24._note: DTHit 36. Reset by sol 11 (DT_G_Reset).games/spectrum.json#/switches/25._note: DTHit 37. Reset by sol 12 (DT_Y_Reset).games/spectrum.json#/switches/26._note: DTHit 38. Reset by sol 12 (DT_Y_Reset).games/spectrum.json#/switches/27._note: DTHit 39. Reset by sol 12 (DT_Y_Reset).games/spectrum.json#/switches/28._note: Controller.Switch on/off. Multiple VPX objects: sw40, sw40agames/spectrum.json#/switches/29._note: Controller.Switch(41) on/off. Dual-direction kick similar to sw7/sw17.games/spectrum.json#/switches/30._note: DTHit 42. Reset by sol 10 (DT_B_Reset).games/spectrum.json#/switches/31._note: DTHit 43. Reset by sol 10 (DT_B_Reset).games/spectrum.json#/switches/32._note: DTHit 44. Reset by sol 10 (DT_B_Reset).games/spectrum.json#/switches/33._note: DTHit 45. Reset by sol 13 (DT_R_Reset).games/spectrum.json#/switches/34._note: DTHit 46. Reset by sol 13 (DT_R_Reset).games/spectrum.json#/switches/35._note: DTHit 47. Reset by sol 13 (DT_R_Reset).games/spectrum.json#/switches/36._note: Controller.Switch(48) on/off. Dual-direction kick similar to sw7/sw17.games/spectrum.json#/coils/0._vbscript_callback: kicker_topleftgames/spectrum.json#/coils/0._inferred_type: ball_managementgames/spectrum.json#/coils/0._note: Kicks ball from sw7 saucer to the left (angle 290)games/spectrum.json#/coils/1._vbscript_callback: kicker_toprightgames/spectrum.json#/coils/1._inferred_type: ball_managementgames/spectrum.json#/coils/1._note: Kicks ball from sw7 saucer to the right (angle 70)games/spectrum.json#/coils/2._vbscript_callback: kicker_midleftgames/spectrum.json#/coils/2._inferred_type: ball_managementgames/spectrum.json#/coils/2._note: Kicks ball from sw41 saucergames/spectrum.json#/coils/3._vbscript_callback: kicker_midrightgames/spectrum.json#/coils/3._inferred_type: ball_managementgames/spectrum.json#/coils/3._note: Kicks ball from sw48 saucergames/spectrum.json#/coils/4._vbscript_callback: DrainSolOutgames/spectrum.json#/coils/4._inferred_type: ball_managementgames/spectrum.json#/coils/4._note: bsD.SolOut — ejects ball from drain (cvpmBallStack)games/spectrum.json#/coils/5._vbscript_callback: vpmSolSound SoundFX("Knocker",DOFKnocker),games/spectrum.json#/coils/5._inferred_type: knockergames/spectrum.json#/coils/5._note: Sound-only callback in VPX — physical knocker coilgames/spectrum.json#/coils/6._vbscript_callback: kicker_botleftgames/spectrum.json#/coils/6._inferred_type: ball_managementgames/spectrum.json#/coils/6._note: Kicks ball from sw17 saucergames/spectrum.json#/coils/7._vbscript_callback: kicker_botrightgames/spectrum.json#/coils/7._inferred_type: ball_managementgames/spectrum.json#/coils/7._note: Kicks ball from sw24 saucergames/spectrum.json#/coils/8._vbscript_callback: DT_B_Resetgames/spectrum.json#/coils/8._inferred_type: drop_target_resetgames/spectrum.json#/coils/8._note: Resets drop targets sw42, sw43, sw44games/spectrum.json#/coils/9._vbscript_callback: DT_G_Resetgames/spectrum.json#/coils/9._inferred_type: drop_target_resetgames/spectrum.json#/coils/9._note: Resets drop targets sw34, sw35, sw36games/spectrum.json#/coils/10._vbscript_callback: DT_Y_Resetgames/spectrum.json#/coils/10._inferred_type: drop_target_resetgames/spectrum.json#/coils/10._note: Resets drop targets sw37, sw38, sw39games/spectrum.json#/coils/11._vbscript_callback: DT_R_Resetgames/spectrum.json#/coils/11._inferred_type: drop_target_resetgames/spectrum.json#/coils/11._note: Resets drop targets sw45, sw46, sw47games/spectrum.json#/coils/12._vbscript_callback: SolGIgames/spectrum.json#/coils/12._inferred_type: gigames/spectrum.json#/coils/12._note: Enables/disables GI lighting. Iterates GI array setting state.games/spectrum.json#/coils/13._vbscript_callback: vpmNudge.SolGameOngames/spectrum.json#/coils/13._inferred_type: systemgames/spectrum.json#/coils/13._note: Standard Bally game-on solenoid. Enables nudge/tilt detection.games/spectrum.json#/_source/confidence_notes: High confidence on switches/coils from explicit Controller.Switch() and SolCallback assignments. No Const sw* definitions — switches identified from _Hit/_UnHit subs and Controller.Switch() calls. No NFadeL/NFadeLm/Flash/Lampz macros found — lamps use vpmMapLights AllLamps (implicit VPX light-to-lamp mapping; actual lamp IDs depend on VPX table light numbering, not extractable from script alone). Early Bally -17/-35 platform. Drain uses cvpmBallStack (not cvpmTrough) with single switch 8. Four saucer kickers (sw7, sw17, sw24, sw41, sw48) each have dual-direction kick logic. Drop targets in 4 banks of 3.
Unresolved questions
- Is the I/O enumeration complete for every supported physical/controller variant?
- Which inferred VPX behaviors reflect real hardware, and which are table-script conveniences?
- Are all mechanism home states, sensors, motion constraints, and ball interactions documented?
Sources
legacy.game.spectrum:games/spectrum.jsonat the pinned migration revision.