Bally MPU AS-2518-35

pinmame.by35

controllers/pinmame/by35.json
47
Machines
1
Author ready
4
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

Diagnostic buttons, switch matrix, and synthetic flipper-button positions

pinmame.input.switch

Switch
Legal addresses
  • -7 … -53 slots
  • 1 … 4848 slots
  • 81 … 888 slots
Transports
  • libpinmamechannel=switch
  • controller_plugingroup_id=1 · contract_revision=a6f6d7266d30
Technical details for Diagnostic buttons, switch matrix, and synthetic flipper-button positionsSource-derived address behavior and exceptions

Matrix addressing

Public switches are sequential matrix positions, not column-times-ten notation: address = (column - 1) * 8 + row. Column 1 is 1-8, and column 6 is 41-48.

by35.c strobes five columns from PIA0:A bits 0-4 and a sixth from PIA1:B, giving at most 48 matrix positions; a game that wires only five columns uses 1-40.

Sixth-column strobe

Which PIA1:B bit supplies the sixth column is game-dependent:

  • The default path reads bit 7.
  • Drivers flagged BY35GD_SWVECTOR read bit 4 instead.

Either way, that bit is also one of the four continuous solenoid outputs published at 17-20. On a six-column game, one public solenoid address therefore carries a switch strobe rather than a coil. Treat a continuously asserted address in that range as a candidate strobe and resolve it per game rather than assuming it is an unused coil.

Diagnostic and flipper positions

  • Diagnostics: Self test, CPU diagnostic, and sound diagnostic are the direct addresses -7, -6, and -5. They live in switch column 0 and are not matrix positions.
  • Flippers: Games declaring FLIP_SW keep their real flipper buttons in the matrix. PinMAME also maintains a generic flipper column at internal column 11, which VPinMAME publishes at 81-88. Unless the driver supplies FLIP_SWNO, FLIP_SWL and FLIP_SWR are zero and core_updateSw never copies that column into the game matrix, so the ROM never reads 81-88.

A definition declares only the columns and positions its own machine wires.

MPU option-switch banks S1-S32

pinmame.input.dip

DIP switch
Legal addresses
  • 1 … 3232 slots
Transports
  • libpinmamechannel=dip
Technical details for MPU option-switch banks S1-S32Source-derived address behavior and exceptions

Physical banks

The MPU carries four eight-position option banks:

Bank Switches
1 S1-S8
2 S9-S16
3 S17-S24
4 S25-S32

The fourth bank exists only on hardware variants flagged BY35HW_DIP4.

Emulator reservation

Individual drivers may declare a larger MDRV_DIPS count than 32 to reserve room for emulator-side options. This does not add physical option switches.

Decoded momentary outputs, continuous outputs, and synthetic flipper outputs

pinmame.output.solenoid

Solenoid
Legal addresses
  • 1 … 1515 slots
  • 17 … 204 slots
  • 46, 482 slots
Transports
  • libpinmamechannel=solenoid
  • controller_plugingroup_id=1 · contract_revision=a6f6d7266d30
Technical details for Decoded momentary outputs, continuous outputs, and synthetic flipper outputsSource-derived address behavior and exceptions

Momentary outputs

The CPU writes a four-bit selector to PIA1:B bits 0-3, and by35.c sets bit (value) of the solenoid word. Therefore, public momentary address = selector + 1, with a public range of 1-15. Selector 15 is the idle state and is masked off, which is why there is no public address 16.

Continuous outputs

PIA1:B bits 4-7 are the four continuous outputs, inverted in hardware and published at 17-20. src/lisy/lisy35.c, which drives real Bally hardware from this driver, identifies continuous bit 1 as the coin lockout and bit 2 as the flipper-enable relay: public 18 and 19, respectively.

Not every continuous address is a coil. On six-column games, one carries the sixth switch-column strobe, and lisy35.c masks that bit out of the coil data per game.

Flippers and self test

  • Flippers: The flipper-enable relay switches the flipper coils rather than a driver-board output, so they have no momentary address. VPinMAME's generic flipper callbacks expose lower-right at 46 and lower-left at 48.
  • Self Test: A machine's printed Self Test number is the order in which the ROM's solenoid test pulses each coil; it is not the public address. The two are unrelated and must be reconciled per game. The self test publishes the mapping directly because it flashes each coil's identification number on the player displays as it fires it, so a harness run resolves it without guessing.

Lamp driver module outputs and optional auxiliary lamp driver outputs

pinmame.output.lamp

Lamp
Legal addresses
  • 1 … 1515 slots
  • 17 … 3115 slots
  • 33 … 4715 slots
  • 49 … 6315 slots
  • 65 … 7915 slots
  • 81 … 9515 slots
  • 97 … 11115 slots
  • 113 … 12715 slots
Transports
  • libpinmamechannel=lamp
  • controller_plugingroup_id=512 · contract_revision=a6f6d7266d30
Technical details for Lamp driver module outputs and optional auxiliary lamp driver outputsSource-derived address behavior and exceptions

Decoder behavior

by35_lampStrobe ignores decoder selector value 0x0f and advances two matrix columns per data bit. The skipped value is a selector, not a public address: public lamp 15 is perfectly addressable.

Each board therefore contributes four runs of fifteen usable outputs. The skipped selector leaves unreachable decoder slots rather than unused lamps:

Board Usable public addresses Unreachable decoder slots
Main 1-15, 17-31, 33-47, 49-63 16, 32, 48, 64
Auxiliary 65-79, 81-95, 97-111, 113-127 80, 96, 112, 128

The AS-2518-23 lamp driver module therefore has sixty outputs at 1-15, 17-31, 33-47, and 49-63.

Auxiliary board limit

A game whose core_tGameData declares a non-zero lampCol also strobes an auxiliary lamp driver board. PinMAME sizes the public lamp count as (8 + lampCol) * 8, so the auxiliary range grows with lampCol and only a game declaring lampCol = 8 reaches 127.

The auxiliary rules below therefore bound the widest case. A definition for a lower-lampCol game must not declare addresses beyond its own (8 + lampCol) * 8 limit, and declaring auxiliary columns never asserts that a machine populates them.

Address calculation

On the main board, the public address a given strobe produces is exactly public = 16 * d + lampadr + 1, where d is the lamp-data line index 0-3 and lampadr is the 0-14 decoder selector. The auxiliary board adds 64. This is the algebraic collapse of by35_lampStrobe's two branches, and it is why the four data lines map onto the four fifteen-address runs.

Evidence

  • Reference

    https://github.com/vpinball/pinmame

    Source locations

    src/wpc/by35.c pia1b_w solenoid selector and continuous nibble, by35_lampStrobe column stride and skipped address, pia0b_r column strobe assembly; src/wpc/by35.h BY35_SWSELFTEST/BY35_SWCPUDIAG/BY35_SWSOUNDDIAG and BY35HW_DIP4; src/wpc/core.h CORE_SOLBIT, CORE_FLIPPERSWCOL, CORE_STDLAMPCOLS/CORE_CUSTLAMPCOL; src/wpc/core.c CORE_CUSTLAMPCOL lamp-column assertion and src/wpc/vpintf.c public lamp-count sizing; src/lisy/lisy35.c lisy35_solenoid_handler momentary and continuous coil identification

    rev
    4ec52ff0ac13
  • Reference

    https://github.com/vpinball/pinmame

    src/libpinmame/libpinmame.cpp SetupMsgApi group definitions

    rev
    a6f6d7266d30

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 47 machines