Identity and controller
Pinned PinMAME groups exactly two 08/88 drivers under torp_e21: the Europe 2.1 parent and torp_a16 1.6 clone. Both use INITGAMES11(torp, GEN_DE, de_dispAlpha2, FLIP1516, SNDBRD_DE1S, 0, 0), so the ROM variants are physically identical. GEN_DE is 0x1000; custSol, swCol, lampCol and the sound-overlay field are zero. The machine-level inversion_applied_by_emulator flag is true because consumers receive normalized public states and must not invert them again. Independently, the initializer leaves the per-game wpc.invSw mask all zeroes and core.c copies it into coreGlobals.invSw. The canonical controller classification is the reviewed pinmame.dataeast profile, not Williams pinmame.system-11, so no controller-platform blocker remains.
de_dispAlpha2 contributes exactly four displays: two seven-character 16-segment rows beginning at 1 and 9 and two seven-character numeric rows beginning at 21 and 29. There are no credit/match or ball-in-play entries, so every display has a controlled cabinet/backbox not_applicable spatial record.
Switches, flippers and polarity
All 64 matrix addresses, Data East service switches -7/-6 and Jumper W7 at DIP 0 are enumerated. The manual's stars mark 1 and 3-7 as cabinet switches. Switches 15 and 16 are not starred: their cells literally print Left EOS and Right EOS, and the description list assigns both part 180-5026-00. They are physical end-of-stroke contacts, not cabinet buttons.
PinMAME's FLIP1516 expands to FLIP_SWNO(15,16). Shared core_updateSw writes left/right player-button bits into those matrix numbers and synthesizes public flipper power/hold outputs 45-48 because the game declares no CPU-controlled flipper solenoids. The button bits live in PinMAME's flipper column, CORE_FLIPPERSWCOL (internal column 11), which core_swSeq2m(n) = n + 7 publishes at switches 81-88: with keyboard handling off it copies the right button (82) into 16 and the left button (84) into 15 on every update, and fabricates 45/46 from 82 and 47/48 from 84, so a recreation drives 82/84, never 15/16. The other six column positions are end-of-stroke and upper-button bits this driver does not use and the ROM cannot read, so they are recorded unused. The retained script also writes cabinet-key state directly to Controller.Switch(15/16); those writes are overwritten and have no effect, while the same keys reach DE.VBS vpmKeyDown/vpmKeyUp, which write swLRFlip = 82 and swLLFlip = 84. That emulator/runtime meaning disagrees with the printed EOS construction; the disagreement is recorded but cannot reach a recreation. The manual prints one lower-left, one lower-right and one upper-right flipper; the right cabinet circuit and retained callback move both right flippers together.
The known-working script has two additional input defects. SW23_Hit pulses 18, turning the Bottom Left Star Rollover into Left Return at runtime, and SW36_Hit pulses 26, turning the Right Star Rollover into the S lane. The manual's address semantics govern the physical records, while both executable defects remain first-class conflicts.
Output map and relay
The manual's CPU Controlled Coil and Flash Lamp Connections page is the physical wiring authority. K1 at public 10 selects eight L/R pairs. Public 1-8 are the L bank: Destroyer, Release Torpedo, Flagship, Aircraft Carrier, Special and Cruiser hotdogs, Scope, and Insert Top. Their R partners are public 25-32: Laser Kicker, Left Kickback, Vertical Up Kicker, Center Kickback, 3-Bank Reset, Knocker, Outhole, and Sinking Ship. Public 9/14/15 are Left/Center/Right #89 pairs, 11 is the general-illumination relay, 12/13 are N.C., and 16 is the 23-840 trough coil. Public 17, 18, 19, 21 and 22 are the five fitted switch-triggered coils; public 20 is the unfitted SP6 slot; 23 is Game On; 24 is the reserved gap; 33-44 are inert for this GameData; 45-48 are synthetic flipper windings; 49/50 are simulator/reserved slots.
Torpedo Alley's own pinned s11.c block types address 9 as one #89 bulb, 11 as G.I., 14-15 as #89 bulbs, and public 25-32 as eight muxed #89 bulbs, with the comment K1 relay is solenoid #10. That makes the R mechanism bank look like lamps and leaves manual L flashers 1-8 at the default type. The source disagreement is preserved; it is not corrected by copying another Data East game's block.
The manual's Coil Test table and location plan say SP1 Center Thumper and SP2 Right Thumper, but the special-coil schematic prints SP2 Center and SP1 Right. The two agreeing manual sections supply the working labels and the swapped schematic text stays committed. The table's literal Left Slingsho cell is also retained in the excerpt and normalized only in the definition label. Crucially, the manual prints SP identities, not public addresses: pinned s11.c PIA comments identify handler indices 0-5 as SP6, SP5, SP2, SP3, SP1 and SP4; applying ssSolNo={3,4,5,1,0,2} derives public 17=SP1, 22=SP2, 18=SP3, 19=SP4, 21=SP5 and 20=SP6. Thus 20 is the unused special-driver state, not 22.
Output 11 has a separate retained-script defect. The script first assigns GIUpdate to 11, then later assigns Sol11BG to the same callback slot; the latter wins. S10, S11, S12, S13 and S23 are outside-playfield backglass proxies, so those callbacks do not relabel physical outputs 10-13/23. They do mean the retained table does not model physical GI 11 faithfully.
Lamp binding and spatial evidence
The table header is exactly Const cGameName="torp_e21",UseSolenoids=2,UseLamps=1,UseSync=0,UseGI=0. After whole-line comments are stripped, there is no Lampz.MassAssign, vpmMapLights, SetLamp, LampCallback, UpdateLamps or AllLamps. Instead, 63 active statements populate the shared VPM Lights(address) array for 1-23 and 25-64. With UseLamps=1, ChangedLamps consumption belongs to the shared VPM core loaded through DE.VBS, not to a loop in this table script.
The extraction contains exactly 64 Light objects named L1 through L64. Those exact names are a naming convention and remain coordinate candidates, never observed physical socket bindings. Active shared-array membership is a separate fact for 63 addresses. Lamp 24 has only a whole-line-commented assignment, so its L24 coordinate is name-only even though the manual fits Insert 1 Torpedo (2) and the extraction contains L24.
Exact table bounds are left=0 top=0 right=1000 bottom=2000; every placement uses x/1000 and y/2000. The resolver refuses any different bounds. Candidate output coordinates come only from active effect callbacks; backglass objects outside those bounds, native render helpers and unbound physical devices are excluded.
Ball handling and moving assemblies
The retained script supplies causal topology. A drained ball enters switch 10/output 31, then occupies the three-ball trough at switches 13, 12 and 11; output 16 releases the front ball. The left two-position lock stages at 42/41 and ejects on 26. The center two-position lock stages at 45/44 and output 28 is configured to kick two balls. Switch 43/output 27 is a custom vertical-up-kicker sequence that raises, recreates and ejects a ball. Switches 29-31 form the three-drop bank reset by output 29. Output 25 fires the Laser Kick plunger object.
Output 32 drives the sinking-ship toy. The retained timer rocks the Ship primitive through fourteen angles and returns it to zero. Manual assembly 500-5084-00 provides the construction: a 30-800 coil, plunger/link, spring and coil bracket move a ship mounting plate carrying the periscope lens. Manual assembly 500-5067-00 similarly confirms the VUK's 23-800 coil, plunger, ball popper and return spring. These are real topology claims because script causality and construction evidence are combined.
The three pop bumpers and two slingshots have source-reconciled circuit topology: manual position/construction plus the Data East PIA map gives 49→19 (left thumper), 50→22 (right thumper), 51→17 (center thumper), 52→18 (left sling) and 53→21 (right sling). No executable SolCallback binds those outputs to table effect objects, so this does not create a physical placement claim. Passive spinners, the manual shooter and fixed ramp are recorded without invented actuators.
What remains unresolved
coverage.missing is exactly output_semantics, mechanism_behavior, polarity, recreation_notes, spatial_placement, and unresolved_conflicts. Output semantics need a PinMAME maintainer explanation or corrected torp_ typing plus a trace across both K1 states, GI 11 and lamp 24. Mechanism behavior remains conflicted where the printed EOS construction and runtime cabinet-button model disagree. Polarity needs a bench capture mapping the synthetic power/hold states 45-48 onto the flipper windings; switches 15/16 are settled, because core_updateSw copies the cabinet-button bits at 82/84 into them. Recreation notes remain candidate while those source conflicts prevent a complete build specification. Spatial completion needs an original-machine socket/address and under-playfield actuator survey covering the playfield, insert board and backbox; the printed quantity of two for each 01L-08L flasher branch is retained, but the table exposes only one usable effect anchor for 01L-06L, two disjoint helper clusters rather than a physical center for 07L, and no active callback for 08L, so no unsupported bulb position is fabricated. Lamp addresses 1, 8, 16, 23, 24, 31 and 32 likewise retain a printed quantity of two while publishing only one candidate object coordinate. No hash-pinned Internet Archive resource or directly verifiable IPDB resource is retained, so the manual's GameEx source URL remains recorded without archive metadata; the machine's IPDB 2603 identity comes from the pinned OPDB snapshot and ROM crosswalk in reports/opdb-identity.json. The six unresolved conflicts need corrected upstream evidence or independent traces that explicitly settle each disagreement; the two flipper end-of-stroke naming records are recorded as ignored, because no evidence about them could change a recreation. Until those exist, the record remains partial.