feat: collect Visual Pinball plugin data trees

Nixie's layouts at vpinball e4a79a5, PinMAME memmaps at tomlogic/pinball-memory-maps 68c1b337 and game definitions at vpinball/pinmame-game-defs 6eece7e5: the subset every platform build copies into third-party/. 1,280 files, each matched to its upstream git blob, documented as three directory entries.
This commit is contained in:
Abdessamad Derraz committed 2026-10-20 00:34:58 +02:00
1 parent 03a10841fb
commit cae30d1e8f
1282 files changed
+2218714 -264

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

@@ -0,0 +1,12 @@
# Default layout for 16x9 LCD displays like Stern's Spike
- ScoreView
Width: 16
Height: 9
Fit: Contain
Visuals:
- Screen:
Rect: [0,0,16,9]
Style: LCD
Size: [16, 9]
@@ -0,0 +1,17 @@
# Layout for Bally's game with a 192x256 CRT used
- ScoreView
Width: 192
Height: 256
Fit: Contain
Visuals:
- Screen:
Rect: [0,0,192,256]
Style: CRT
Size: [192, 256]
Glass:
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [128,0,192,256]
Ambient: [0.2,0.2,0.2]
@@ -0,0 +1,17 @@
# Layout for Mr. Game's video games with a 256x248 CRT (Dakar, Motor Show, Mac Attack, World Cup 90)
- ScoreView
Width: 256
Height: 248
Fit: Contain
Visuals:
- Screen:
Rect: [0,0,256,248]
Style: CRT
Size: [256, 248]
Glass:
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [384,132,256,248]
Ambient: [0.2,0.2,0.2]
@@ -0,0 +1,28 @@
# Default layout for alphanumeric display with 2 x 16 digit score displays
# Based on Williams early WPC: elements are every 18.5 units (relative to the base 24x32 used size)
- ScoreView
Width: 301.5
Height: 75
Fit: Contain
Visuals:
- SegDisplay:
Rect: [0,6,310,32]
Src: ctrl://default/seg?id=0
XPos: [0.00, 18.5, 37, 55.5, 74, 92.5, 111, 129.5, 148, 166.5, 185, 203.5, 222, 240.5, 259, 277.5]
Glass:
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Area: [0,32,990,100]
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [0,38,310,32]
Src: ctrl://default/seg?id=1
XPos: [0.00, 18.5, 37, 55.5, 74, 92.5, 111, 129.5, 148, 166.5, 185, 203.5, 222, 240.5, 259, 277.5]
Glass:
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Area: [0,132,990,100]
Ambient: [0.4,0.4,0.4]
@@ -0,0 +1,30 @@
# Default layout for alphanumeric display with 2 x 20 digit score displays
# Based on Gottlieb System 80B and System 3 displays with a blue glass filter
- ScoreView
Width: 49.5
Height: 12.375
Fit: Contain
Visuals:
- SegDisplay:
Rect: [0,1.2,49.5,5]
Src: ctrl://default/seg?id=0
XPos: [0.00, 2.42, 4.84, 7.27, 9.69, 12.11, 14.53, 16.95, 19.38, 21.80, 24.22, 26.64, 29.06, 31.48, 33.91, 36.33, 38.75, 41.17, 43.59, 46.02]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Area: [0,32,990,100]
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [0,6.2,49.5,5]
Src: ctrl://default/seg?id=1
XPos: [0.00, 2.42, 4.84, 7.27, 9.69, 12.11, 14.53, 16.95, 19.38, 21.80, 24.22, 26.64, 29.06, 31.48, 33.91, 36.33, 38.75, 41.17, 43.59, 46.02]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Area: [0,132,990,100]
Ambient: [0.4,0.4,0.4]
@@ -0,0 +1,68 @@
# Default layout for alphanumeric display with 4 x 7 digit score displays
- ScoreView
Width: 280
Height: 70
Fit: Contain
Visuals:
- SegDisplay:
Rect: [0,0,102.5,32]
Src: ctrl://default/seg?id=0
XPos: [0, 14.25, 28.5, 49.5, 63.75, 78]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [178,0,102.5,32]
Src: ctrl://default/seg?id=1
XPos: [0, 14.25, 28.5, 49.5, 63.75, 78]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [0,26,102.5,32]
Src: ctrl://default/seg?id=2
XPos: [0, 14.25, 28.5, 49.5, 63.75, 78]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [178,26,102.5,32]
Src: ctrl://default/seg?id=3
XPos: [0, 14.25, 28.5, 49.5, 63.75, 78]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [107,50,54,24]
Src: ctrl://default/seg?id=4
XPos: [0, 13.5]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Ambient: [0.4,0.4,0.4]
- SegDisplay:
Rect: [140,50,54,24]
Src: ctrl://default/seg?id=5
XPos: [0, 13.5]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.15
Image: ./Glass-Dirty-1.webp
Ambient: [0.4,0.4,0.4]
@@ -0,0 +1,52 @@
# Default layout for alphanumeric display with 4 x 7 digit score displays
# Based on Gottlieb System 1/80/80A displays with a blue glass filter
- ScoreView
Width: 320
Height: 64
Fit: Contain
Visuals:
- SegDisplay:
Rect: [15,0,140,32]
Src: ctrl://default/seg?id=0
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [0,0,560,128]
Ambient: [0.25,0.25,0.25]
- SegDisplay:
Rect: [165,0,140,32]
Src: ctrl://default/seg?id=1
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [232,128,560,128]
Ambient: [0.25,0.25,0.25]
- SegDisplay:
Rect: [15,32,140,32]
Src: ctrl://default/seg?id=2
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [370,256,560,128]
Ambient: [0.25,0.25,0.25]
- SegDisplay:
Rect: [165,32,140,32]
Src: ctrl://default/seg?id=3
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [122,384,560,128]
Ambient: [0.25,0.25,0.25]
@@ -0,0 +1,70 @@
# Default layout for alphanumeric display with 4 x 7 digit score displays
# Based on Gottlieb System 1/80/80A displays with a blue glass filter
# Score display is 1.58 taller than credit/ball display, so we use 32 for score and 20 for ball/credit
- ScoreView
Width: 280
Height: 70
Fit: Contain
Visuals:
- SegDisplay:
Rect: [-4,-2,128,32]
Src: ctrl://default/seg?id=0
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Ambient: [0.125,0.125,0.125]
- SegDisplay:
Rect: [152,-2,128,32]
Src: ctrl://default/seg?id=1
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Ambient: [0.125,0.125,0.125]
- SegDisplay:
Rect: [-4,28,128,32]
Src: ctrl://default/seg?id=2
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Ambient: [0.125,0.125,0.125]
- SegDisplay:
Rect: [152,28,128,32]
Src: ctrl://default/seg?id=3
XPos: [0, 18, 36, 54, 72, 90, 108]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Ambient: [0.125,0.125,0.125]
- SegDisplay:
Rect: [112.7,51.5,26.25,20]
Src: ctrl://default/seg?id=4
XPos: [0, 11.25]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Ambient: [0.125,0.125,0.125]
- SegDisplay:
Rect: [140.2,51.5,26.25,20]
Src: ctrl://default/seg?id=5
XPos: [0, 11.25]
Glass:
#Tint: [0.030,0.250,0.500]
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Ambient: [0.125,0.125,0.125]
@@ -0,0 +1,17 @@
# Default layout for 128x16 DMD
- ScoreView
Width: 128
Height: 16
Fit: Contain
Visuals:
- DMD:
Rect: [0,0,128,16]
Style: Neon Plasma
Size: [128, 16]
Glass:
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [0,0,1024,128]
Ambient: [0.4,0.4,0.4]
@@ -0,0 +1,17 @@
# Default layout for 128x32 DMD
- ScoreView
Width: 128
Height: 32
Fit: Contain
Visuals:
- DMD:
Rect: [0,0,128,32]
Style: Neon Plasma
Size: [128, 32]
Glass:
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [0,0,1024,256]
Ambient: [0.4,0.4,0.4]
@@ -0,0 +1,17 @@
# Default layout for 192x64 DMD used by Sega
- ScoreView
Width: 192
Height: 64
Fit: Contain
Visuals:
- DMD:
Rect: [0,0,192,64]
Style: Neon Plasma
Size: [192, 64]
Glass:
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [0,0,768,256]
Ambient: [0.4,0.4,0.4]
@@ -0,0 +1,17 @@
# Layout for Pinball 2000's 640x480 CRT (Revenge From Mars, Star Wars Episode I)
- ScoreView
Width: 640
Height: 480
Fit: Contain
Visuals:
- Screen:
Rect: [0,0,640,480]
Style: CRT
Size: [640, 480]
Glass:
Roughness: 0.1
Image: ./Glass-Dirty-1.webp
Area: [192,16,640,480]
Ambient: [0.2,0.2,0.2]
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,156 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.by35",
"authority": "pinmame",
"hardware_family": "Bally MPU AS-2518-35",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Diagnostic buttons, switch matrix, and synthetic flipper-button positions",
"address_rules": [
{
"minimum": -7,
"maximum": -5
},
{
"minimum": 1,
"maximum": 48
},
{
"minimum": 81,
"maximum": 88
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix addressing\n\nPublic 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`.\n\n`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`.\n\n#### Sixth-column strobe\n\nWhich `PIA1:B` bit supplies the sixth column is game-dependent:\n\n- The default path reads bit `7`.\n- Drivers flagged `BY35GD_SWVECTOR` read bit `4` instead.\n\nEither 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.\n\n#### Diagnostic and flipper positions\n\n- **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.\n- **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`.\n\nA definition declares only the columns and positions its own machine wires.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "MPU option-switch banks S1-S32",
"address_rules": [
{
"minimum": 1,
"maximum": 32
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
},
"notes": "#### Physical banks\n\nThe MPU carries four eight-position option banks:\n\n| Bank | Switches |\n| --- | --- |\n| 1 | `S1-S8` |\n| 2 | `S9-S16` |\n| 3 | `S17-S24` |\n| 4 | `S25-S32` |\n\nThe fourth bank exists only on hardware variants flagged `BY35HW_DIP4`.\n\n#### Emulator reservation\n\nIndividual drivers may declare a larger `MDRV_DIPS` count than 32 to reserve room for emulator-side options. This does not add physical option switches.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Decoded momentary outputs, continuous outputs, and synthetic flipper outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 15
},
{
"minimum": 17,
"maximum": 20
},
{
"values": [
46,
48
]
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Momentary outputs\n\nThe 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`.\n\n#### Continuous outputs\n\n`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.\n\nNot 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.\n\n#### Flippers and self test\n\n- **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`.\n- **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.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Lamp driver module outputs and optional auxiliary lamp driver outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 15
},
{
"minimum": 17,
"maximum": 31
},
{
"minimum": 33,
"maximum": 47
},
{
"minimum": 49,
"maximum": 63
},
{
"minimum": 65,
"maximum": 79
},
{
"minimum": 81,
"maximum": 95
},
{
"minimum": 97,
"maximum": 111
},
{
"minimum": 113,
"maximum": 127
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Decoder behavior\n\n`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.\n\nEach board therefore contributes four runs of fifteen usable outputs. The skipped selector leaves unreachable decoder slots rather than unused lamps:\n\n| Board | Usable public addresses | Unreachable decoder slots |\n| --- | --- | --- |\n| Main | `1-15`, `17-31`, `33-47`, `49-63` | `16`, `32`, `48`, `64` |\n| Auxiliary | `65-79`, `81-95`, `97-111`, `113-127` | `80`, `96`, `112`, `128` |\n\nThe `AS-2518-23` lamp driver module therefore has sixty outputs at `1-15`, `17-31`, `33-47`, and `49-63`.\n\n#### Auxiliary board limit\n\nA 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`.\n\nThe 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.\n\n#### Address calculation\n\nOn 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.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "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"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,94 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.capcom",
"authority": "pinmame",
"hardware_family": "Capcom CC",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Cabinet, playfield, and synthetic flipper switch addresses",
"address_rules": [
{
"minimum": 1,
"maximum": 16
},
{
"minimum": 17,
"maximum": 80
},
{
"minimum": 81,
"maximum": 88
},
{
"minimum": 89,
"maximum": 96
}
],
"transports": {
"libpinmame": {
"channel": "switch"
}
},
"notes": "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.\n\n`cc_m2sw(col, row)` maps the internal matrix as follows:\n\n| Internal column | Public address | Purpose |\n| --- | --- | --- |\n| 0-8 | `9 + row + col * 8` | Public 9-80 |\n| 9 | `1 + row` | Public 1-8 |\n| 10 | `89 + row` | Public 89-96 |\n| Any other column (11 in practice) | `81 + row` | Public 81-88 |\n\n- **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, which a host drives through 82 and 84 (see 81-88).\n- **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.\n- **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.\n- **81-88 -- flipper column: two host button inputs plus synthetic state.** Internal column 11 (`CORE_FLIPPERSWCOL`, `src/wpc/core.h`) is PinMAME's flipper column, maintained by `core_updateSw` (`src/wpc/core.c`); no `cc` ROM reads it. Every `cc` driver declares `FLIP_SWNO(5,6)` in `src/wpc/capgames.c`'s `#define FLIP`, so with keyboard handling off (`g_fHandleKeyboard = 0`, the LibPinMAME default in `src/libpinmame/libpinmame.cpp`) `core_updateSw` reads the button bits `CORE_SWLRFLIPBUTBIT` and `CORE_SWLLFLIPBUTBIT` from this column and, in its block commented 'set switches in matrix for non-fliptronic games', writes them into matrix switches 6 and 5 every frame. **82 is therefore the host input for the physical right flipper button and 84 the host input for the left one.** Switches 5 and 6 are what the ROM reads; a host write to either lasts at most one frame. None of the other six bits has a Capcom circuit behind it. The shared `FLIP_SOL(FLIP_LL | FLIP_LR | FLIP_UR | FLIP_UL)` declaration implies `FLIP_EOS` for all four positions, so the end-of-stroke model synthesizes 81, 83, 85 and 87 and overwrites them every frame. No `cc` driver declares `FLIP_SW(FLIP_U)`, so the upper-button bits 86 and 88 lie outside `locals.flipMask`: `core_updateSw` leaves a host write there unchanged, and neither it nor any `cc` ROM acts on either bit.\n- **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.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Solenoids, flashers, motors, and Fast Flips state",
"address_rules": [
{
"minimum": 1,
"maximum": 32
},
{
"minimum": 33,
"maximum": 50
},
{
"minimum": 51,
"maximum": 51
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
}
},
"notes": "#### Physical outputs\n\n**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`.\n\n`MACHINE_INIT(cc)` in `src/wpc/capcom.c` assigns the bulb-driver type per root game:\n\n| Root prefix | Game | Flasher outputs |\n| --- | --- | --- |\n| `abv` | Airborne | `20-27` |\n| `bbb` | Big Bang Bar | `21-26` |\n| `bsv` | Breakshot | `28-32` |\n| `ffv` | Flipper Football | `28-32` |\n| `kpb` | Kingpin | `18-19`, `21-31` |\n| `pmv` | Pinball Magic | `21-31` |\n\nBreakshot'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. Kingpin's own ROM Solenoid Test prints every output from 18 to 31 as a 20 V flasher; the gap at 20 is the Big Al flasher, which Krellan places on the backglass and the retained table does not bind (see `machines/partial/capcom/kingpin-1996.json`).\n\nThe 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.\n\n#### Legacy flipper mirrors\n\nAddresses 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:\n\n| Physical address | Legacy mirror | PinMAME mirror name |\n| --- | --- | --- |\n| 9 | 45 | `sLRFlipPow` |\n| 10 | 47 | `sLLFlipPow` |\n| 11 | 33 | `sURFlipPow` |\n| 12 | 35 | `sULFlipPow` |\n\nTreat **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:\n\n> This should be removed as this push the legacy PinMAME specific mapping forward while it does not correspond to manuals or any other reference\n>\n> 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.\n\nHere `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.\n\nThe 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.\n\n#### Reserved and custom state\n\n- **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.\n- **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.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "CPU-controlled lamp outputs and diagnostic LEDs (no separate general-illumination channel)",
"address_rules": [
{
"minimum": 1,
"maximum": 136
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
}
},
"notes": "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.\n\n- **Matrix A** occupies public addresses 1-64 when fitted.\n- **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`.\n- **The final eight published addresses** are diagnostic allocation. The first two report the CPU- and sound-board LEDs; the remaining six are unused.\n\nMost 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`.\n\nThe 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.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "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, its keyboard-off read of the CORE_FLIPPERSWCOL button bits and 'set switches in matrix for non-fliptronic games' FLIP_SWL/FLIP_SWR copy, and synthetic 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.cpp (int g_fHandleKeyboard = 0, the LibPinMAME keyboard-handling default); 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)"
}
]
}
@@ -0,0 +1,119 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.dataeast",
"authority": "pinmame",
"hardware_family": "Data East/Sega System",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Data East service buttons, the 8x8 switch matrix, and PinMAME's flipper column",
"address_rules": [
{
"minimum": -7,
"maximum": -6
},
{
"minimum": 1,
"maximum": 64
},
{
"minimum": 81,
"maximum": 88
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Public matrix addresses\n\nData East uses PinMAME's sequential, column-major `1-64` switch namespace inherited by `MACHINE_DRIVER_START(s11)` from `MACHINE_DRIVER_START(PinMAME)`. The registered conversion is `core_swSeq2m(n)=n+7`, so `column=((n-1)/8)+1` and `row=((n-1)%8)+1` for public address `n` (`src/wpc/core.c` `core_swSeq2m`/`core_m2swSeq`; `src/wpc/s11.c` `MACHINE_DRIVER_START(s11)`). It is not WPC's column-times-ten notation.\n\nData East matrix strobes are one-hot. `pia4b_w` keeps only the first asserted strobe bit when `locals.deGame` is true, and `pia4a_r` passes that selected column to `core_getSwCol` (`src/wpc/s11.c`). Public address numbering remains sequential; this hardware detail matters when interpreting traces with malformed multi-bit strobes.\n\n#### Cabinet column and diagnostics\n\n`DE_COMPORTS` supplies ordinary column 1 at public addresses `1-8`: tilt=`1`, ball tilt=`2`, start=`3`, coin 1-3=`4-6`, slam tilt=`7`, and no defined cabinet input at `8` (`src/wpc/s11.h`). These are part of the same switch namespace as the playfield matrix. A game using `S11_MUXSW2` may overwrite public switch `2` with the live mux-relay state in `SWITCH_UPDATE(s11)`; identify switch `2` from the game-specific driver and manual rather than assuming it is always a physical ball-tilt switch.\n\nOnly two negative service addresses exist on Data East hardware:\n\n| Address | PinMAME constant | Driver behavior |\n| --- | --- | --- |\n| `-7` | `DE_SWADVANCE` | Black Advance button; `s11_irqline` presents its asserted public state inverted to PIA2 CA1. |\n| `-6` | `DE_SWUPDN` | Green Up/Down button; presented directly to PIA2 CB1. |\n\nWilliams-only CPU and sound diagnostic addresses `-5` and `-4` are not part of the Data East contract. `DE_COMPORTS2` changes the later green button from toggling to momentary input behavior, but its public address remains `-6` (`src/wpc/s11.h`).\n\n#### Flipper column\n\nPinMAME keeps the cabinet flipper buttons in its own flipper switch column, `CORE_FLIPPERSWCOL` (internal column 11, `src/wpc/core.h`). The same `core_swSeq2m(n)=n+7` conversion publishes that column at `81-88`:\n\n| Address | Bit | Position |\n| --- | --- | --- |\n| `81` | `CORE_SWLRFLIPEOSBIT` (`0x01`) | Lower right end-of-stroke |\n| `82` | `CORE_SWLRFLIPBUTBIT` (`0x02`) | Lower right button |\n| `83` | `CORE_SWLLFLIPEOSBIT` (`0x04`) | Lower left end-of-stroke |\n| `84` | `CORE_SWLLFLIPBUTBIT` (`0x08`) | Lower left button |\n| `85` | `CORE_SWURFLIPEOSBIT` (`0x10`) | Upper right end-of-stroke |\n| `86` | `CORE_SWURFLIPBUTBIT` (`0x20`) | Upper right button |\n| `87` | `CORE_SWULFLIPEOSBIT` (`0x40`) | Upper left end-of-stroke |\n| `88` | `CORE_SWULFLIPBUTBIT` (`0x80`) | Upper left button |\n\nNo pinned Data East driver sets `FLIP_SOL`: each declares `FLIP_SWNO(l,r)` or no flipper bits at all, so the flippers are cabinet-wired and the CPU drives no flipper coil. `core_updateSw` (`src/wpc/core.c`) then does three things on every update:\n\n- With keyboard handling off (the LibPinMAME default), it reads the two lower button bits from this column as the host wrote them; no driver on this platform sets an `invSw` bit in column 11.\n- It copies `82` into matrix switch `r` and `84` into matrix switch `l` through `core_setSw`, so a host write to `l` or `r` itself is overwritten on the next update. A driver that declares no switch number for a side (a zero in `FLIP_SWNO`, or no flipper bits) gets no copy for that side.\n- While the switched-solenoid enable is on (public `23`, which `s11.c` passes to `core_updateSw` as `locals.ssEn`), it fabricates the synthetic flipper outputs `45/46` from `82` and `47/48` from `84` (`CORE_LRFLIPSOLBITS`, `CORE_LLFLIPSOLBITS`).\n\nA consumer that wants a flipper button to reach the ROM drives `82`/`84`, never the matrix address the game's manual prints for it. The addresses and the copy are identical to the System 9/11 profile's, because Data East runs on the same `s11` driver and the same `core_updateSw`.\n\n`locals.flipMask` gains an end-of-stroke bit only from `FLIP_EOS` (implied by `FLIP_SOL`) and an upper button bit only from `FLIP_SW(FLIP_UR)`/`FLIP_SW(FLIP_UL)`. No pinned driver on this platform sets either, so `core_updateSw` never copies `81`, `83` or `85-88` anywhere and PinMAME models no end-of-stroke switch here. A host write to them survives in the column, but the ROM cannot read it there: `s11.c`'s `pia4a_r` reads the matrix only through `core_getSwCol` with an eight-bit column strobe, which reaches columns 1-8. A definition enumerates `81-88` and states which of them its own driver uses.\n\n#### Inversion and extensions\n\nThe profile's `inversion_applied_by_emulator` field means consumers use the public LibPinMAME state as delivered and do not perform a second inversion. It does not assert that every game has a nonzero `invSw` mask. The common `INITGAMES11` Data East initializer zero-initializes that mask; custom drivers must be checked individually. ALine truncated
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "Country jumper W7",
"address_rules": [
{
"values": [
0
]
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
},
"notes": "#### Country jumper\n\nThe shared driver exposes one DIP-style configuration bit at public address `0`: the physical country jumper read by `pia2a_r` as `core_getDip(0)<<7`. Data East input definitions reuse the shared one-jumper machine driver (`src/wpc/s11.c` `pia2a_r` and `MACHINE_DRIVER_START(s11)`; `src/wpc/s11.h` shared country-jumper declaration). It is not a bank of operator DIP switches.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Data East coil, flasher, relay, special-solenoid, auxiliary-output, and virtual flipper states",
"address_rules": [
{
"minimum": 1,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Address map\n\nThe public namespace is a platform-sized outer bound; a machine definition must mark its actual populated, virtual, and unused addresses from its own driver, manual, and trace.\n\n| Addresses | Data East behavior |\n| --- | --- |\n| `1-8` | Eight momentary `A`-side drivers written by `latch2200`. |\n| `9-16` | Eight controlled drivers written by `PIA0:B`; `INITGAMES11` assigns mux relay K1 to public `10`. |\n| `17-22` | Six special-solenoid public states, gated by public enable `23`; see the permutation below. |\n| `23` | `S11_GAMEONSOL` / `CORE_SSFLIPENSOL`, a public virtual enable state for the flipper and switched-solenoid supply. It is not a playfield coil. |\n| `24` | Reserved gap; no shared driver writes a device state here. |\n| `25-32` | Relay-selected `C`-side aliases of the eight physical drivers at `1-8`; see the mux rule below. |\n| `33-36` | Generic upper-flipper range from the cross-platform API. `core_getSol` has no Data East implementation for it, so these addresses are always zero. |\n| `37-44` | Shared-driver auxiliary-output range. DMD-family initializers that pass `S11_PRINTERLINE` as `hw.gameSpecific1` publish `pia2b_w`'s printer-line byte here; alpha initializers reviewed for this profile do not enable `S11_SNDOVERLAY`. Check each game's initializer, source, and runtime evidence before declaring the range populated or unused. |\n| `45-48` | Virtual lower-flipper power/hold states derived from the cabinet flipper button bits at public `82` (right) and `84` (left) while output `23` enables flippers: right power=`45`, right hold=`46`, left power=`47`, left hold=`48`. |\n| `49` | Cross-platform simulator ball-shooter state, not a physical Data East driver-board output. |\n| `50` | Reserved gap. |\n| `51-64` | Game-specific custom outputs, present only when the driver declares `hw.custSol` and a `getSol` hook. |\n\nData East general illumination is not a separate LibPinMAME GI channel. The shared driver types the appropriate per-game ordinary solenoid output as an AC bulb/relay; most Data East games use output `11`, but the exact populated outputs and electrical types come from the game's own `MACHINE_INIT(s11)` name block and manual. Bind those devices to `pinmame.output.solenoid` with machine output kind `gi`.\n\n#### Special-solenoid permutation\n\nPIA-driven special solenoids are active-low at the PIA handler and gated by `locals.ssEn`. Data East selects `ssSolNo[1]={3,4,5,1,0,2}` in `setSSSol`, producing this exact handler-to-public mapping (`src/wpc/s11.c`):\n\n| PIA handler | Handler slot | Public address |\n| --- | ---: | ---: |\n| `pia1ca2_w` | `0` | `20` |\n| `pia1cb2_w` | `1` | `21` |\n| `pia3ca2_w` | `2` | `22` |\n| `pia3cb2_w` | `3` | `18` |\n| `pia4ca2_w` | `4` | `17` |\n| `pia4cb2_w` | `5` | `19` |\n\nDo not infer SP1-SP6 physical labels from those public numbers. When a game instead populates `sxx.ssSw`, the VBLANK path indexes those slots sequentially as public `17+ii` and does not apply the PIA permutation. Manual circuit identity, PIA handler, `sxx.ssSw` slot, and public output address remain separate facts until a game-specific trace reconciles them.\n\n#### K1 A/C mux\n\n`updsol()` detects the game-specific mux relay—public `10` for the common `INITGAMES11` Data East initializer—and, while it is active, copies the low driver byte from public `1-8` into public `25-32` instead. These are alternate circuits behind the same eight transistors and K1 relay contacts, not sixteen independent drivers. The machine's manual and working VPX script decide which A-side or C-side device is physically wired to each pair. Playboy 35th sets `S11_MUXDELAY`, so `pia0b_w` processes the previous controlled-driver byte and delays the mux decision by one IRQ; traces must preserve that timing rather than expecting same-callback switching.\n\n#### Auxiliary outputs and flippers\n\nFor Data East DMD generations whose initializer sets `S11_PRINTERLINE`, `pia2b_w` writes an eight-bit printer-line/auxiliary byte into internal PWM slots `41-48`; `core_getSol`, `core_getAllSol`, and `core_getAllPhysicSols` expose those slots as public `37-44`. The 128x16 path inverts that byte, while the 128x32/192x64 path does not. The reviewed alpha initializers do not enable `S11_SNDOVERLAY`. Never infer a physical device, availability, or polarity from the shared range alone.\n\nThe common Data East driver macros use `FLIP_SWNO(...)` without `FLIP_SOL(...)`. `core_updateSw` therefore fabricates public `45-48` from the left/right cabinet button bits at public `84`/`82` (the switch group's flipper column) only while public `23` enables the flippers. They are useful controller states for a recreation but do not identify four independently controlled driver-board transistors or prove the physical EOS/power-winding polarity.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Data East 8x8 lamp matrix and optional game-specific columns",
"address_rules": [
{
"minimum": 1,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Standard matrix\n\n`MACHINE_INIT(s11)` publishes `64 + hw.lampCol*8` lamp states. The standard Data East matrix is public `1-64`, numbered column-major with the same sequential conversion as switches: `column=((n-1)/8)+1`, `row=((n-1)%8)+1`. `pia1a_w` supplies active-low rows and `pia1b_w` supplies columns to `core_write_pwm_output_lamp_matrix` (`src/wpc/s11.c`).\n\nA nonzero `hw.lampCol` adds game-specific columns above `64`; this base profile does not silently claim them. General illumination is not part of this lamp group or a separate GI channel on this driver—it is represented by the game's ordinary solenoid/relay output.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/s11.c (s11_irqline, SWITCH_UPDATE(s11), pia1a_w/pia1b_w/pia2a_r/pia2b_w/pia4a_r/pia4b_w, setSSSol, updsol, pia0b_w/pia0cb2_w, MACHINE_INIT(s11), MACHINE_DRIVER_START(s11)); src/wpc/s11.h (DE_COMPORTS/DE_COMPORTS2, DE_SWADVANCE/DE_SWUPDN, S11_GAMEONSOL and hardware flags); src/wpc/degames.c (INITGAMES11, FLIP_SWNO constants and Data East game initializers); src/wpc/core.c (core_swSeq2m/core_m2swSeq, core_updateSw, core_getSol/core_getAllSol/core_getAllPhysicSols); src/wpc/core.h (public solenoid constants and core_tGameData sxx fields); src/wpc/gen.h (GEN_DE/GEN_DEDMD16/GEN_DEDMD32/GEN_DEDMD64/GEN_ALLS11)"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,183 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.gts3",
"authority": "pinmame",
"hardware_family": "Gottlieb System 3 (GEN_GTS3)",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Cabinet test inputs, Gottlieb-numbered switch matrix, and synthetic flipper column",
"address_rules": [
{
"minimum": -8,
"maximum": -5
},
{
"minimum": 0,
"maximum": 7
},
{
"minimum": 10,
"maximum": 17
},
{
"minimum": 20,
"maximum": 27
},
{
"minimum": 30,
"maximum": 37
},
{
"minimum": 40,
"maximum": 47
},
{
"minimum": 50,
"maximum": 57
},
{
"minimum": 60,
"maximum": 67
},
{
"minimum": 70,
"maximum": 77
},
{
"minimum": 80,
"maximum": 87
},
{
"minimum": 90,
"maximum": 97
},
{
"minimum": 100,
"maximum": 107
},
{
"minimum": 110,
"maximum": 117
},
{
"minimum": 140,
"maximum": 147
}
],
"transports": {
"libpinmame": {
"channel": "switch"
}
},
"notes": "#### Matrix conversion\n\n`MACHINE_DRIVER_START(gts3)` in `src/wpc/gts3.c` registers `MDRV_SWITCH_CONV(gts3_sw2m, gts3_m2sw)`, so public switch numbers are Gottlieb's own decimal notation: the tens digit is the strobe (matrix column) and the units digit the return (row).\n\n| Function | Definition |\n| --- | --- |\n| `gts3_sw2m(no)` | `(no / 10 + 1) * 8 + no % 10`, or `-1` when `no % 10 > 7` |\n| `gts3_m2sw(col, row)` | `row - 8` for internal column 0, otherwise `(col - 1) * 10 + row` |\n\nA number whose last digit is 8 or 9 has no switch: `gts3_sw2m` returns `-1`, and `core_setSw`/`core_getSw` do not bounds-check the index they then use, so never write one.\n\n#### Switch matrix\n\nThe CPU strobes up to twelve columns with the same 12-bit shift register that strobes the lamp matrix (`xvia_0_b_w`, `LDATA`/`LSTRB`), and reads the eight returns on VIA U4 port A through `xvia_0_a_r`, which returns `~core_getSwCol(GTS3locals.lampColumn)`. The public matrix is therefore `0-7`, `10-17`, ..., `110-117` (internal columns 1-12). The read is complemented in hardware, so public `1` is the closed-contact reading the CPU sees. No `INITGAME*` macro in `src/wpc/gts3games.c` sets an inverted-switch mask, so PinMAME normalizes nothing per game: a switch the ROM treats as active at public `1` has a contact that rests open.\n\nWith PinMAME keyboard handling on, `SWITCH_UPDATE(GTS3)` also rewrites the low bits of internal column 1 (public `0-7`) from the cabinet port, and the port layout follows the game's `INITGAME*` macro (`src/wpc/gts3.h`):\n\n| Macro | Port flag | Public addresses rewritten |\n| --- | --- | --- |\n| `INITGAME2` (`GTS32_COMPORTS`) | `0x8000` | `0` Coin 2, `1` Coin 1, `2` Coin 3, `3` Coin 4, `4` Start, `5` Tournament (toggle), `6` Coin Door (toggle) |\n| `INITGAME1` (`GTS31_COMPORTS`) and `INITGAME_IC` (`GTS3_IC_COMPORTS`) | `0x4000` | `0` Coin 2, `1` Coin 1, `2` Coin 3, `3` Coin 4, `4` Start |\n| `INITGAME` (`GTS3_COMPORTS`) | none | `0` Coin 2, `1` Coin 1, `2` Coin 3, `3` Start, `4` Left Advance, `5` Right Advance |\n\nThe port labels are emulator key names, not the game's switch names; take those from the game's own switch test. With keyboard handling off, every one of these addresses keeps what the host writes.\n\n#### Cabinet test inputs\n\nInternal column 0 is not part of the matrix. `SWITCH_UPDATE(GTS3)` reads four of its bits back through `core_getSw` into dedicated latches every update (`GTS3_SWDIAG`, `GTS3_SWTILT`, `GTS3_SWSLAM`, `GTS3_SWPRIN` in `src/wpc/gts3.h`):\n\n| Address | Constant | CPU read path |\n| --- | --- | --- |\n| `-8` | `GTS3_SWDIAG` | Test (diagnostic) switch: VIA U4 `PB3` on the DMD generation and the second alpha generation, VIA U4 `CA1` on the first alpha generation |\n| `-7` | `GTS3_SWTILT` | Tilt: VIA U4 `PB4` |\n| `-6` | `GTS3_SWSLAM` | Slam tilt: VIA U4 `CA1` (on the first alpha generation `PB3`) |\n| `-5` | `GTS3_SWPRIN` | Printer present: the communications adapter status `aux1_r` returns |\n\n`dmd_u4_pb_r` and `alpha_u4_pb_r` copy the latches without inversion (the source comments say `NOT INVERTED!`). With keyboard handling on, the cabinet port rewrites them from the Diagnostic, Ball Tilt, Slam Tilt and Printer keys; with it off they keep the host's writes. Bits `-4` to `-1` are never read.\n\n#### Flipper column\n\n`core_updateSw` (`src/wpc/core.c`) keeps the cabinet flipper buttons in internal column 15 for `GEN_GTS3` (its `flipSwCol` test), not in `CORE_FLIPPERSWCOL`. `gts3_m2sw(15, row)` publishes that column at `140-147`:\n\n| Address | Bit | Position |\n| --- | --- | --- |\n| `140` | `CORE_SWLRFLIPEOSBIT` | Lower right end-of-stroke |\n| `141` | `CORE_SWLRFLIPBUTBIT` | Lower right button |\n| `142` | `CORE_SWLLFLIPEOSBIT` | Lower left end-of-stroke |\n| `143` | `CORE_SWLLFLIPBUTBIT` | Lower left button |\n| `144` | `CORE_SWURFLIPEOSBIT` | Upper right end-of-stroke |\n| `145` | `CORE_SWURFLIPBUTBIT` | Upper right button |\n| `146` | `CORE_SWULFLIPEOSBIT` | Upper left end-of-stroke |\n| `147` | `CORE_SWULFLIPBUTBIT` | Upper left button |\n\nEvery pinned System 3 driver declares its flippers with `FLIP_SWNO(l, r)` (two alpha games with `FLIP_SW(FLIP_L)`), never `FLIP_SOL`, `FLIP_EOS` or an upper `FLIP_SW`, so `locals.flipMask` holds only the two lower button bits. With keyboard handling off, `core_updateSw` reads `141` and `143` as the host wrote them, copies them into the game's `FLIP_SWNO` matrix switches on every update (overwriting any direct write there), and fabricates the synthetic flipper outputs `45-48` from them while the game-on relay (solenoid `32`) is energized. The ROM cannot read column 15: the 12-bit strobe reaches internal columns 1-12 only. The VPinMAME library `GTS3.VBS` names the same addresses `swLRFlip = 141`, `swLLFlip = 143`, `swURFlip = 145` and `swULFlip = 147`.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Driver-board outputs, relays, and synthetic flipper outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 32
},
{
"minimum": 45,
"maximum": 48
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
}
},
"notes": "#### Physical outputs\n\n`solenoid_w` (`src/wpc/gts3.c`, CPU writes to `0x2030-0x2033`) stores four bytes into `coreGlobals.pulsedSolState`, so bit `n-1` is public solenoid `n` for `1-32`. `GTS3_interface_update` copies that state into `coreGlobals.solenoids` every `GTS3_SOLSMOOTH` (4) video frames, so a pulse shorter than that window can be lost or stretched in the binary solenoid stream. A game's own Relay & Solenoid Test names each output, so take the pairing from that game's test rather than a sibling's: Stargate's displays the driver number counted from `0`, one less than the public address that fires.\n\n`gts3dmd_init` and `GTS3_alpha_common_init` set the platform's relay conventions, which the games' tests corroborate by name:\n\n| Public | Platform role |\n| --- | --- |\n| `26` | 'A' relay: lightbox insert (backbox) lamps |\n| `31` | 'T' relay: playfield general illumination (the tilt relay) |\n| `32` | 'Q' relay: game on; `GTS3_interface_update` passes its state to `core_updateSw` as the flipper enable |\n\n`coreGlobals.nGI = 0`: there is no separate general-illumination channel, and the relays are ordinary solenoid outputs. The per-game `strncasecmp` blocks in the two init functions only choose PWM brightness models (`CORE_MODOUT_BULB_89_20V_DC_GTS3`, `CORE_MODOUT_LED`, ...) for flasher and LED outputs; they model brightness, not fitment.\n\n#### Synthetic flipper outputs\n\nNo System 3 driver sets `FLIP_SOL`, so `core_updateSw` fabricates the lower flipper outputs from the flipper-column buttons `141`/`143` while `32` is energized. `core_getAllSol`, which feeds LibPinMAME's changed-solenoid reports outside physical-output mode, publishes `45`/`46` for the lower right button and `47`/`48` for the lower left one, both bits of a pair together. In physical-output (modulated) mode `vp_getChangedSolenoids` reads `physicOutputState` instead, which System 3 never writes above `32`. The upper-flipper range `33-36`, the `37-44` extension range and the simulator outputs `49-50` carry nothing on this platform.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Gottlieb-numbered lamp matrix and auxiliary driver board outputs",
"address_rules": [
{
"minimum": 0,
"maximum": 7
},
{
"minimum": 10,
"maximum": 17
},
{
"minimum": 20,
"maximum": 27
},
{
"minimum": 30,
"maximum": 37
},
{
"minimum": 40,
"maximum": 47
},
{
"minimum": 50,
"maximum": 57
},
{
"minimum": 60,
"maximum": 67
},
{
"minimum": 70,
"maximum": 77
},
{
"minimum": 80,
"maximum": 87
},
{
"minimum": 90,
"maximum": 97
},
{
"minimum": 100,
"maximum": 107
},
{
"minimum": 110,
"maximum": 117
},
{
"minimum": 120,
"maximum": 127
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
}
},
"notes": "#### Lamp matrix\n\n`MACHINE_DRIVER_START(gts3)` also registers `MDRV_LAMP_CONV(gts3_sw2m, gts3_m2sw)`, and `vp_getChangedLamps` reports internal lamp column `c` (0-based), row `r` as `gts3_m2sw(c + 1, r)`, that is `c * 10 + r`. Public lamp numbers are therefore Gottlieb's decimal lamp numbers and **start at `0`**: `0-7`, `10-17`, ..., `110-117`.\n\n`xvia_0_b_w` shifts a 12-bit column strobe (two 74HC164s, the same strobe the switch matrix uses) and `lds_w` (`0x2040`) latches the eight row outputs, so the matrix is twelve columns by eight rows. The emulation accumulates a frame until the strobe restarts at the first column.\n\n#### Auxiliary driver board\n\nWhen a game declares `hw.lampCol > 4` (the last argument of its `INITGAME*` macro), `xvia_1_b_w` writes VIA U5 port B (`DX0-DX7`, connector A1P6) into `coreGlobals.lampMatrix[12]`, published at `120-127`. The source calls these \"flashers driven by auxiliary board\". Games with `hw.lampCol = 4` use the same port for an extra LED display or nothing, and publish nothing at `120-127`. `coreGlobals.nLamps = 64 + hw.lampCol * 8`, so a definition narrows this ceiling to its own game's declaration.\n\nThere is no general-illumination lamp channel: G.I. is switched by the 'T' and 'A' relays on the solenoid outputs.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "external:pinmame-review-artifacts/vpm-script-libs/gts3.vbs",
"revision": "sha256:66c329fa86e97d2f10a8036a9a6527be6a67ce59bb3591962aa1c8a9da101314",
"locator": "VPinMAME script library GTS3.VBS: GameOnSolenoid = 32, swCoin1-4 = 00-03, swDiagnostic = -8, swTilt = -7, swSlamTilt = -6, swLRFlip = 141, swLLFlip = 143, swURFlip = 145, swULFlip = 147, and the vpmKeyDown/vpmKeyUp handlers that write them"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "97aa922bf8e4b6970126192ec1ac1fb0305a4f62",
"locator": "src/wpc/gts3.c (xvia_0_a_r, alpha_u4_pb_r, dmd_u4_pb_r, xvia_0_b_w lamp/switch strobe, xvia_1_b_w auxiliary board, GTS3_interface_update, SWITCH_UPDATE(GTS3), gts3_sw2m/gts3_m2sw, GTS3_alpha_common_init and gts3dmd_init output sizing and relay conventions, solenoid_w, lds_w, GTS3_readmem/GTS3_writemem, MACHINE_DRIVER_START(gts3) MDRV_SWITCH_CONV/MDRV_LAMP_CONV); src/wpc/gts3.h (GTS3_COMPORTS, GTS31_COMPORTS, GTS32_COMPORTS, GTS3_IC_COMPORTS, GTS3_SWDIAG/GTS3_SWTILT/GTS3_SWSLAM/GTS3_SWPRIN, GTS3_SOLSMOOTH); src/wpc/gts3games.c (INITGAME, INITGAME_IC, INITGAME1, INITGAME2 and every game's FLIP_SWNO and lampCol argument); src/wpc/core.c (core_updateSw flipSwCol and synthetic lower-flipper outputs, core_getSwCol, core_setSw/core_getSw, core_getAllSol); src/wpc/core.h (CORE_FIRSTLFLIPSOL, CORE_SW*FLIP*BIT, CORE_*FLIPSOLBITS); src/wpc/vpintf.c (vp_getChangedLamps, vp_getChangedSolenoids); src/wpc/gen.h and src/libpinmame/libpinmame.h (GEN_GTS3 / PINMAME_HARDWARE_GEN_GTS3 = 0x0020000000000)"
}
]
}
@@ -0,0 +1,174 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.gts80",
"authority": "pinmame",
"hardware_family": "Gottlieb System 80",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Dedicated slam, sound-test and video inputs, the 8x8 strobe/return switch matrix, and the synthetic flipper-button column",
"address_rules": [
{
"minimum": -8,
"maximum": -1
},
{
"minimum": 0,
"maximum": 7
},
{
"minimum": 10,
"maximum": 17
},
{
"minimum": 20,
"maximum": 27
},
{
"minimum": 30,
"maximum": 37
},
{
"minimum": 40,
"maximum": 47
},
{
"minimum": 50,
"maximum": 57
},
{
"minimum": 60,
"maximum": 67
},
{
"minimum": 70,
"maximum": 77
},
{
"minimum": 111,
"maximum": 118
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix conversion\n\n`MACHINE_DRIVER_START(gts80)` in `src/wpc/gts80.c` installs its own converters, `MDRV_SWITCH_CONV(GTS80_sw2m, GTS80_m2sw)`, so a public System 80 switch number is the factory's two-digit matrix number: the tens digit is the strobe and the units digit the return, as in the game manuals' \"SW.nn\" cells.\n\n| Public | Internal | Meaning |\n| --- | --- | --- |\n| `n` in `0-77` (units digit `0-7`) | column `(n+1)%10`, row `(n+1)/10` | strobe `n/10`, return `n%10` |\n| `-8` to `-1` | column 0, row `n+8` | dedicated inputs outside the matrix |\n| `111-118` | column 11, row `n%10-1` | PinMAME's flipper switch column |\n\nThe ROM strobes one row per scan through RIOT U4 port B (`riot6532_0b_w`) and `riot6532_0a_r` returns `swMatrix[1..8]` for the strobed row, so it can read only internal columns 1-8: public `x0-x7` for strobes `0-7`. Numbers whose units digit is 8 or 9, and columns 9 and 10, are never read.\n\n#### Return 7 and the cabinet\n\nInternal column 8 is return 7. When PinMAME's own keyboard handling is on, `SWITCH_UPDATE(GTS80)` rewrites its six low rows from `GTS80_COMPORTS` on every update: `07` Test, `17` Coin 1, `27` Coin 2, `37` Coin 3, `47` Start and `57` Tilt (`src/wpc/gts80.h`). With keyboard handling off, as under LibPinMAME and VPinMAME, the host writes these addresses directly. The ROM reads return 7 like any other column; `67` and `77` are not in the port. Which cabinet switch is wired to which return-7 position is game documentation.\n\n#### Dedicated inputs\n\n| Address | Source | Hardware |\n| --- | --- | --- |\n| `-1` | `GTS80_SWSLAMTILT`, port bit `0x8000` \"Slam Tilt\" | the slam switch, read on RIOT U5 port A bit 7 (`slam_sw_r`), never through the matrix |\n| `-4` | port bit `0x1000` \"Sound Test\" | the sound board's test button: `SWITCH_UPDATE(GTS80)` passes `swMatrix[0] & 0x10` to `sndbrd_0_diag` |\n| `-8` to `-5` | port bits `0x0100-0x0800` (`GTS80VID_COMPORTS`) | Caveman's video joystick; published only on `GTS80_DISPVIDEO` drivers |\n\n`-3` and `-2` are not written by any port.\n\nThe slam input is published active-high: `SWITCH_UPDATE(GTS80)` presents RIOT U5 PA7 to the ROM as `invPattern` (0) while `core_getSw(-1)` is set and as `0xff` otherwise, and System 80 games' per-game `invSw` is zero. So public `-1 = 1` means the slam contact is open (slammed), and a consumer holds `-1` at 0 for a machine at rest.\n\n#### Flipper buttons\n\nSystem 80 flippers are switched by the cabinet buttons through relay contacts and the CPU never reads the buttons. PinMAME still keeps its flipper switch column at internal column 11 (`CORE_FLIPPERSWCOL`), which `GTS80_sw2m`'s `no >= 96` branch publishes at `111-118`: `CORE_SWLRFLIPBUTBIT` is public `112` and `CORE_SWLLFLIPBUTBIT` public `114`. The `INIT_S80`, `INIT_S80D7` and `INIT_S80A` game macros in `src/wpc/gts80games.c` set `hw.flippers` to 0, so `core_updateSw` copies the buttons into no matrix switch and models no end-of-stroke or upper-button bit; it uses `112` and `114` only to fabricate the synthetic flipper outputs (see the solenoid group). `111`, `113` and `115-118` carry nothing.\n\n#### Polarity\n\nEvery `INIT_S80`/`INIT_S80D7`/`INIT_S80A` game declares a zero `invSw`, and `riot6532_0a_r` returns `swMatrix` bits unmodified, so a matrix switch's public `1` is the closed contact the ROM reads.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board switches S1-S32 and the sound-board option banks",
"address_rules": [
{
"minimum": 1,
"maximum": 42
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
},
"notes": "#### Addressing\n\n`MDRV_DIPS(42)` declares 42 DIP bits. A public DIP address is `bank * 8 + bit + 1` (`core_getDip`).\n\n| Addresses | Bank | Consumer |\n| --- | --- | --- |\n| `1-32` | 0-3 | the CPU board's switches S1-S32 (`GTS80_DIPS` ports 1-2), read by `riot6532_0a_r` through `core_getDip((riot2b>>4)&0x03)` while RIOT U5 port B bit 7 is set, bit-reversed by `core_revbyte` |\n| `33-40` | 4 | the sound/speech board's bank (`GTS80_SNDDIPS` \"SS:S1-S8\"), read once by `gts80ss_init` (`src/wpc/gts80s.c`) |\n| `41-42` | 5, bits 0-1 | the sound-only board's two switches (\"S:S1\", \"S:S2\"), read once by `gts80s_init` |\n\nWhich switch does what is game documentation; a definition cites its own manual.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Nine solenoid drivers, the synthetic game-on and tilt relay states, and synthetic flipper outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 11
},
{
"minimum": 45,
"maximum": 48
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Address map\n\n| Addresses | Behavior |\n| --- | --- |\n| `1-8` | `riot6532_2a_w`: RIOT U6 port A, inverted. Bits 0-1 select one of solenoids 1-4 while bit 5 enables them, and bits 2-3 one of 5-8 while bit 6 enables them, so at most one of 1-4 and one of 5-8 is on at a time. |\n| `9` | Port A bit 7 drives solenoid 9 directly. |\n| `10` | Synthetic, binary mode only: `GTS80_vblank` publishes lamp 0's driver state (the Q, game-over relay) while lamp 1 (the T, tilt relay) is off. This is the game-on state, and the same bit is the `flipEn` argument of `core_updateSw`. |\n| `11` | Synthetic, binary mode only: lamp 1's driver state (the T relay). |\n| `12-44` | Not published: `core_getSol` reads `coreGlobals.solenoids` for `1-28`, where System 80 sets only bits `0-10`, and returns `0` for `29-44`, whose branches serve other generations. |\n| `45-48` | Synthetic lower-flipper outputs. |\n\nThe same port byte also carries the sound command: on every write except on `SNDBRD_GTS80B` boards, `GTS80_sndCmd_w` sends the inverted byte's low four bits while its bit 4 is set (0 otherwise), plus `0x10` while lamp 9 (Sound 16) is on.\n\n#### Synthetic flipper outputs `45-48`\n\nNo System 80 driver declares `FLIP_SOL`, so `core_updateSw` fabricates flipper state in `coreGlobals.solenoids2` from the right (`112`) and left (`114`) button bits while the game-on bit (solenoid `10`) is set: `45`/`46` follow the right button and `47`/`48` the left. There is no driver-board output behind them.\n\n#### Physical-output mode\n\nIn PinMAME's physical-output mode `riot6532_2a_w` also writes solenoids 1-9 to the physical lamp outputs 52-60 (see the lamp group).\n\nWhen physical or modulated solenoid output is enabled (`CORE_MODOUT_ENABLE_PHYSOUT_SOLENOIDS`, `CORE_MODOUT_ENABLE_MODSOL` or `CORE_MODOUT_FORCE_ON`), `core_getSol` reads `1-28` from `physicOutputState`, which System 80 writes only for solenoids 1-9, so `10` and `11` read `0` in that mode. A consumer in that mode takes the same states from the physical lamp outputs: game on is lamp `0` on while lamp `1` is off, and the tilt state is lamp `1`. The synthetic flipper outputs `45-48` are unaffected, because `GTS80_vblank` still passes its own game-on bit to `core_updateSw`.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Twelve latched lamp columns, the inverted twelfth column, and the physical-output solenoid mirrors",
"address_rules": [
{
"minimum": 0,
"maximum": 63
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Addressing\n\nRIOT U6 port B selects one of twelve 4-bit lamp latches (bits 4-7, columns 1-12) and carries its four lamp states (bits 0-3, `riot6532_2b_w`). The latches are not strobed: each holds its value. `MDRV_LAMP_CONV(GTS80_lamp2m, GTS80_m2lamp)` makes the public lamp number the factory's \"L\" number: `vp_getLampIndex(n)` is `lamp2m(n) - 8 = n`, so public `n` is bit `n%8` of `lampMatrix[n/8]`, and lamp `0` exists.\n\n| Public | Source |\n| --- | --- |\n| `0-47` | the twelve latches, four lamps each, in order |\n| `48-51` | `lampMatrix[6] = data ^ 0x0f` of the twelfth latch: the inverted state of lamps `44-47`, the System 80 driver board's inverted latch outputs |\n| `52-63` | binary mode: constant 0. Physical-output mode: `52-60` mirror solenoids 1-9 (`riot6532_2a_w`), `61-63` stay 0 |\n\n`MACHINE_INIT(gts80)` sets `coreGlobals.nLamps = 64 + hw.lampCol * 8`, and every System 80 game declares `lampCol = 0`.\n\n#### Platform-wide lamp roles\n\n`GTS80_vblank` treats lamp 0 as the GameOn relay (published as solenoid 10) and lamp 1 as the Tilt relay (solenoid 11) for `GEN_GTS80` and `GEN_GTS80A`, and `MACHINE_INIT(gts80)` types lamps 0, 1 and 4 as two-state outputs. `riot6532_2a_w` adds lamp 9 to the sound command as bit 4 (Sound 16) on every board except `SNDBRD_GTS80B`, which takes `lampMatrix[0] & 0x10` (lamp 4) instead. What the other lamp outputs drive, including the relays and coils that games run from lamp drivers, is game documentation.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "One physical-output-mode GI channel that mirrors lamp 0",
"address_rules": [
{
"values": [
0
]
}
],
"transports": {
"libpinmame": {
"channel": "gi"
},
"controller_plugin": {
"group_id": 256,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "`MACHINE_INIT(gts80)` declares one GI output (`coreGlobals.nGI = 1`) of type `CORE_MODOUT_BULB_44_6_3V_AC_REV`, and `riot6532_2b_w` writes lamp 0's latch bit to it whenever the first lamp latch is written, with the source comment \"Duplicate lamp 0 to GI string as it drives the Tilt relay that in turn drives the main GI\". It carries state only in PinMAME's physical-output mode; in binary mode `vp_getGI` returns `coreGlobals.gi[0]`, which System 80 never writes, so it is constant 0. Whether a game's general illumination follows lamp 0, lamp 1 or other relays is game documentation.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "97aa922bf8e4b6970126192ec1ac1fb0305a4f62",
"locator": "src/wpc/gts80.c (switch numbering header, GTS80_vblank solenoid 10/11 synthesis and core_updateSw(gameOn & 0x01), GTS80_sw2m/GTS80_m2sw, GTS80_lamp2m/GTS80_m2lamp, SWITCH_UPDATE(GTS80), riot6532_0a_r/riot6532_0b_w switch matrix, slam_sw_r, riot6532_2a_w solenoids 1-9 and sound command, riot6532_2b_w lamp latches and the inverted 13th column, MACHINE_INIT(gts80) nGI/nLamps/nSolenoids and output types, MACHINE_DRIVER_START(gts80) MDRV_DIPS(42), MDRV_SWITCH_CONV, MDRV_LAMP_CONV); src/wpc/gts80.h (GTS80_COMPORTS, GTS80VID_COMPORTS, GTS80_DIPS, GTS80_SNDDIPS, GTS80_SWSLAMTILT); src/wpc/gts80games.c (INITGAME, INIT_S80, INIT_S80D7, INIT_S80A: hw.flippers 0, zero invSw, lampCol 0); src/wpc/gts80s.c (gts80s_init core_getDip(5), gts80ss_init core_getDip(4)); src/wpc/core.c (core_updateSw, core_getSol, core_getDip, CORE_MODOUT_BULB_44_6_3V_AC_REV); src/wpc/core.h (CORE_FLIPPERSWCOL, CORE_SWLRFLIPBUTBIT, CORE_SWLLFLIPBUTBIT, CORE_FIRSTLFLIPSOL); src/wpc/vpintf.c (vp_getLampIndex, vp_getLamp, vp_getChangedLamps, vp_getGI)"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,79 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.p2k",
"authority": "pinmame",
"hardware_family": "Midway Pinball 2000",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Playfield matrix, coin-door, diagnostic, EOS, and cabinet inputs",
"address_rules": [
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 },
{ "minimum": 111, "maximum": 118 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Playfield matrix\n\nAddresses `11-88` use column-times-ten plus one-based row notation. Values ending in `9` or `0` are not matrix positions. PinMAME translates those public addresses through `p2k_sw2m` and `p2k_m2sw`.\n\n#### Dedicated inputs\n\nThe board's 24 direct inputs are exposed as three public columns: printed `D1-D8` become `91-98`, `D9-D16` become `101-108`, and `D17-D24` become `111-118`. They carry coin, diagnostic, EOS, cabinet, and action-button inputs.\n\n#### Polarity\n\nP2K publishes every public switch active-high: `1` beam blocked, contact closed, or button pressed, and `0` inactive. The optos rest closed and the board reads them raw active-low, so `MACHINE_INIT(p2k)` declares the per-game opto list (`p2k_optoList`) in `coreGlobals.invSw` through `core_updInvSw`; `core_getSw` and `core_setSw` apply that inversion, so the board keeps its raw level while the public API is active-high for every switch, opto or not. Revisions before upstream ccba7199 instead published the optos at their raw active-low level and refreshed them to `1` every frame, so runtime evidence recorded on such a revision carries the opposite opto level. The profile's `inversion_applied_by_emulator` field means consumers use the public state exactly as delivered and apply no further inversion; a switch's `normally_closed` remains a construction fact about the contact.\n\n#### Diagnostic keys\n\nPinMAME's keyboard port maps keys 7, 8, 9 and 0 to Enter (public `104`), Down (`102`), Up (`103`) and Escape (`101`). Before upstream 4ea35501 keys 8 and 9 were the other way round; the public switch numbers did not change.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Power-driver board coils, flashers, flipper circuits, and custom outputs",
"address_rules": [
{ "minimum": 1, "maximum": 32 },
{ "minimum": 45, "maximum": 48 },
{ "minimum": 51, "maximum": 62 }
],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "Board drivers `1-32` retain their number. Board drivers `33-36` are the lower-flipper circuits and are exported at public solenoids `45-48`. Board drivers `37-48` are exported as custom public solenoids `51-62`. Public ranges `33-44` and `49-50` do not represent Pinball 2000 driver-board positions and are intentionally excluded.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Eight columns of two interleaved eight-row lamp banks",
"address_rules": [
{ "minimum": 1, "maximum": 128 }
],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "PinMAME numbers Pinball 2000 lamps from one. The sixteen exported lamp bytes hold the board's eight columns of two interleaved eight-row banks (bank A at byte `2c`, bank B at `2c+1`), and the public lamp number is the bit index plus one: P2K inherits the default `MDRV_LAMP_CONV(core_swSeq2m, core_m2swSeq)`, so `vp_getLampIndex(n)` reads bit `n - 1` and changed-lamp reports return bit index plus one. For the manual's column, bank, and row notation use `address = (column - 1) * 16 + (bank B ? 8 : 0) + (row - 1) + 1`. Thus manual `11A` is public `1` and `88B` is public `128`; there is no public lamp `0`. Upstream cc2296d8 renumbered `p2k_names.h` to match; its earlier table counted from 0 and sat one below every public lamp number. PinMAME's machine-test walk verified all 128 positions.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "b7a60eb0dd9722f5397fc296987d94528ab111ff",
"locator": "src/wpc/p2k.c p2k_sw2m/p2k_m2sw, p2k_optoList and MACHINE_INIT(p2k) core_updInvSw opto declaration, SWITCH_UPDATE(p2k) diagnostic and cabinet columns, p2k_sync_io, p2k_getSol, p2k_solIndex, P2K_CUSTSOL_COUNT, p2kGameData, and p2k_disp; src/wpc/core.c core_getSw/core_setSw/core_updInvSw and the default MDRV_LAMP_CONV(core_swSeq2m, core_m2swSeq); src/wpc/vpintf.c vp_getLampIndex and vp_getChangedLamps; src/wpc/p2k_names.h measured device-table notes and one-based lamp rule; src/libpinmame/libpinmame.h PINMAME_HARDWARE_GEN_P2K"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi controller-plugin group definitions"
}
]
}
@@ -0,0 +1,150 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.pinheck",
"authority": "pinmame",
"hardware_family": "Spooky Pinball pinHeck",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Cabinet inputs, 8x8 playfield matrix, and PinMAME flipper column",
"address_rules": [
{
"minimum": 1,
"maximum": 8
},
{
"minimum": 11,
"maximum": 18
},
{
"minimum": 21,
"maximum": 28
},
{
"minimum": 31,
"maximum": 38
},
{
"minimum": 41,
"maximum": 48
},
{
"minimum": 51,
"maximum": 58
},
{
"minimum": 61,
"maximum": 68
},
{
"minimum": 71,
"maximum": 78
},
{
"minimum": 81,
"maximum": 88
},
{
"minimum": 91,
"maximum": 98
},
{
"minimum": 101,
"maximum": 108
},
{
"minimum": 111,
"maximum": 118
}
],
"transports": {
"libpinmame": {
"channel": "switch"
}
},
"notes": "`MACHINE_DRIVER_START(PINHECK)` in `src/wpc/pinheck.c` installs `MDRV_SWITCH_CONV(pinheck_sw2m, pinheck_m2sw)`: public address `n` is internal column `n / 10` and row `n % 10 - 1`, so `pinheck_m2sw(col, row) = col * 10 + row + 1` and only rows 1-8 of each decade exist. Any other number maps to an unread column.\n\n| Public | Internal column | What it is |\n| --- | --- | --- |\n| 1-8 | 0 | Cabinet inputs U12 D0-D7 (factory cabinet switches 1-8) |\n| 11-88 | 1-8 | The 8x8 playfield matrix: factory switch `n` (0-63) is public `(n / 8 + 1) * 10 + n % 8 + 1` |\n| 91-98 | 9 | Cabinet inputs U11 D0-D7 (factory cabinet switches 9-15 at 91-97) |\n| 101-108 | 10 | Unused core allocation (`CORE_STDSWCOLS = 12`) |\n| 111-118 | 11 | PinMAME's flipper column (`CORE_FLIPPERSWCOL`) |\n\n**Matrix 11-88.** `pinheck_brd_swcol(col)` hands the board emulation (`src/wpc/pinheck/board.c`) `swMatrix[col + 1]` for strobe column 0-7, and `pinheck_board_read` pulls a return line low for every set bit, which is how the PIC32 sees a closed contact. Public `1` is therefore the closed (active) contact and no `invSw` mask exists: consume the level as delivered. The factory charts print the same 0-63 numbering, and the ROM's own Switch Edge test draws each closure at the chart's column and row.\n\n**Cabinet 1-8 and 91-98.** `pinheck_brd_cab` packs `swMatrix[0]` (bits 0-7) and `swMatrix[9]` (bits 8-15) into the cabinet word the board shifts in through its 74HC165 pair, read active-low like the matrix. `pinheck.c` documents the mapping as firmware cabinet switch `n` = public `n` for 1-8 and `n + 82` for 9-15. `SWITCH_UPDATE(pinheck)` names the bits: 1 coin door closed (`swMatrix[0]` bit 0, set at every board reset because the door rests closed), 2 the operator User button, 3 and 4 the flipper buttons, 5 Back, 6 Enter, 7 coin, 8 tilt, and 94 (`swMatrix[9]` bit 3) Start. With keyboard handling off (the LibPinMAME default) `core_updateSw` passes `SWITCH_UPDATE` a null port array and it returns at once, so a host writes 1, 2, 5-8 and 91-98 directly. Which of 91-98 a game fits (optos, extra buttons) is per game.\n\n**Flipper buttons 3, 4 and 111-118.** Every pinHeck driver declares `FLIP_SWNO(PINHECK_SWLFLIP, PINHECK_SWRFLIP)` = `FLIP_SWNO(4, 3)` with no `FLIP_SOL`. `core_updateSw` reads the host's lower button bits from the flipper column, `CORE_SWLRFLIPBUTBIT` at **112** (right) and `CORE_SWLLFLIPBUTBIT` at **114** (left), and copies them into cabinet switches 3 and 4 on every vblank, so drive 112/114, not 3/4: a host write to 3 or 4 is overwritten on the next vblank. The vblank calls `core_updateSw(0)`, so no synthetic flipper solenoid is fabricated, and without `FLIP_EOS` no end-of-stroke bit is synthesized: 111, 113 and 115-118 hold whatever a host writes and nothing reads them. The flippers are ordinary board coils fired by the ROM, and their end-of-stroke contacts, where fitted, are matrix switches.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Coils, GI/flasher strings, RGB LEDs and servos",
"address_rules": [
{
"minimum": 1,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
}
},
"notes": "All addresses come from `src/wpc/pinheck.c` (`PINHECK_SOL_*`, `pinheck_brd_*`, `pinheck_getsol`) and the generic getters in `src/wpc/core.c` (`core_getSol`, `core_getAllPhysicSols`). `pinheck_brd_init` sets `CORE_MODOUT_FORCE_ON`, so LibPinMAME reports these as 0-255 physical levels.\n\n| Public | Source | Output type |\n| --- | --- | --- |\n| 1-24 | The 24 MOSFET coil drivers: factory coil `n` (0-23) is public `n + 1` (`pinheck_brd_sols`) | two-state |\n| 25-32 | GI/flasher outputs GI 0-7, the first 74HC595 byte (`pinheck_brd_gi`, `PINHECK_SOL_GI0`) | LED (PWM level) |\n| 33-36 | Dead: `core_getAllPhysicSols` fills them from upper-flipper bits that no pinHeck driver sets | always 0 |\n| 37-44 | GI 8-15, the second 74HC595 byte (`PINHECK_SOL_GI8`, read through the 37-44 branch `GEN_PINHECK` shares with System 11 and SAM) | LED (PWM level) |\n| 45-48 | Dead: lower-flipper bits, never set because the vblank calls `core_updateSw(0)` | always 0 |\n| 49 | PinMAME's simulator-only shooter output; the ROM never drives it | simulator |\n| 50 | Reserved | always 0 |\n| 51-56 | On-board WS2801 RGB LEDs 0 and 1, channels R, G, B (`PINHECK_SOL_RGB`) | 0-255 level |\n| 57-61 | Servos 0-4: the pulse width scaled between the game's `servoMin` and `servoMax` to 0-255 in integer clock ticks, rounded half up (`pinheck_brd_servo`; revisions before 97aa922b scaled in floating point); a servo without pulses keeps its last level | 0-255 position |\n| 62-64 | External WS2801 LED 0 R, G, B, or on-board LED 2 when the game sets `onbLed2` (America's Most Haunted) | 0-255 level |\n\nThe coil outputs are gated by the board's watchdog (`board.c`: a PG15 low edge keeps `wd_on` for 9/8 s), so every coil drops when the PIC32 stops kicking it. The ROM fires the flippers through ordinary coil drivers; PinMAME publishes no Fliptronic flipper states for this platform. `hw.custSol = PINHECK_CUSTSOLS = 14` gives `coreGlobals.nSolenoids = 64`. A WS2801 LED beyond those listed has no public output; the driver logs that once. Which GI output feeds general illumination and which a flasher is wired per game.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "8x8 lamp matrix and Start-button lamp",
"address_rules": [
{
"minimum": 11,
"maximum": 18
},
{
"minimum": 21,
"maximum": 28
},
{
"minimum": 31,
"maximum": 38
},
{
"minimum": 41,
"maximum": 48
},
{
"minimum": 51,
"maximum": 58
},
{
"minimum": 61,
"maximum": 68
},
{
"minimum": 71,
"maximum": 78
},
{
"minimum": 81,
"maximum": 88
},
{
"minimum": 91,
"maximum": 98
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
}
},
"notes": "`MDRV_LAMP_CONV(pinheck_lamp2m, pinheck_m2sw)` numbers lamps like switches: factory lamp `n` (0-63) of the 8x8 column/row matrix is public `(n / 8 + 1) * 10 + n % 8 + 1`, so the matrix is **11-88**. The Start-button lamp is a separate board output (PA3, `pinheck_brd_start`) published as internal lamp 64, public **91**. `coreGlobals.nLamps = 72`, so 92-98 also exist and are never lit. Matrix lamps are PWM-integrated (`core_set_pwm_output_led_vfd`; a lamp is lit at most 2 of every 24 strobe periods); the Start lamp is an LED output. There is no separate general-illumination channel (`coreGlobals.nGI = 0`): the GI strings are solenoid outputs 25-32 and 37-44.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "97aa922bf8e4b6970126192ec1ac1fb0305a4f62",
"locator": "src/wpc/pinheck.c (file header; PINHECK_SOL_GI0/GI8/RGB/SRV/EXT, PINHECK_LAMP_ST, PINHECK_NSOLS, PINHECK_NLAMPS; pinheck_brd_swcol, pinheck_brd_cab, pinheck_brd_lamps, pinheck_brd_sols, pinheck_brd_gi, pinheck_brd_start, pinheck_brd_rgb, pinheck_brd_servo, pinheck_2m/pinheck_sw2m/pinheck_lamp2m/pinheck_m2sw, pinheck_getsol, pinheck_brd_init, pinheck_brd_reset, pinheck_brd_vblank, SWITCH_UPDATE(pinheck), pinheck_vblank, MACHINE_DRIVER_START(PINHECK)/(PINHECKDMD)); src/wpc/pinheck.h (PINHECK_SWLFLIP/SWRFLIP, PINHECK_CUSTSOLS, PINHECK_COMPORTS, PINHECK_GAMEDEF, pinheck_tGameData); src/wpc/pinheck/board.c and board.h (coil port/bit tables, watchdog, lamp strobe, 74HC595 GI and 74HC165 cabinet shift registers, WS2801 chains, servo pulse timing, switch read); src/wpc/pinheckgames.c and src/wpc/sims/pinheck/{amh,dominos,jetsons,rzspook}.c (per-game core_tGameData); src/wpc/core.c (core_updateSw, core_getSol, core_getAllSol, core_getAllPhysicSols GEN_PINHECK branches); src/wpc/core.h (CORE_FLIPPERSWCOL, CORE_SWLRFLIPBUTBIT/CORE_SWLLFLIPBUTBIT, CORE_STDSWCOLS, CORE_FIRSTCUSTSOL); src/wpc/gen.h (GEN_PINHECK); src/libpinmame/libpinmame.h (PINMAME_HARDWARE_GEN_PINHECK = 0x10000000000000)"
}
]
}
@@ -0,0 +1,93 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.sam",
"authority": "pinmame",
"hardware_family": "Stern S.A.M.",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Switch and dedicated-switch inputs",
"address_rules": [
{ "minimum": -7, "maximum": 72 },
{ "minimum": 81, "maximum": 88 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Public input ranges\n\nSAM uses sequential public switch numbering.\n\n| Hardware inputs | Public addresses |\n| --- | --- |\n| Matrix switches | `1-64` |\n| Dedicated `D1-D8` | `65-72` |\n| Dedicated `D17-D24` | `-7` through `0` |\n| Flipper `D9-D16` | `81-88`, in PinMAME's flipper column with right/left and EOS ordering |\n\n#### Polarity\n\nThe platform leaves the per-game `invSw` mask zero, so physical normally-closed/opto construction remains a per-game evidence question. `inversion_applied_by_emulator` only states that consumers must not re-invert the public API state.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "Dedicated DIP switch bank",
"address_rules": [{ "minimum": 1, "maximum": 8 }],
"transports": { "libpinmame": { "channel": "dip" } }
},
{
"id": "physical.output.ticket",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Optional ticket-dispenser service functions",
"address_rules": [{ "minimum": 33, "maximum": 35 }],
"transports": {},
"notes": "**Physical service-diagnostic identities** for optional ticket hardware.\n\nThey are deliberately not LibPinMAME solenoid addresses: SAM public solenoid `33` is PinMAME's synthetic game-on state, and the stable API does not expose these cabinet functions.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Main and auxiliary driver outputs",
"address_rules": [{ "minimum": 1, "maximum": 66 }],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Shared address space\n\nSAM main-driver and game-specific auxiliary outputs share PinMAME's public solenoid address space.\n\n| Addresses | Meaning |\n| --- | --- |\n| `1-32` | Base driver outputs |\n| `33` | PinMAME's synthetic game-on/fast-flip state; never a physical transistor |\n| `51-66` | Full custom range published by the platform macro for every SAM game |\n\n#### Auxiliary write paths\n\n`gameSpecific1` selects which auxiliary write path, if any, can drive `51-66`. Each machine must therefore mark inactive public holes unused.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Lamp matrix outputs",
"address_rules": [{ "minimum": 1, "maximum": 339 }],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "**Conventional matrix:** `1-80`.\n\nSAM node-board games expose additional LED channels through backward-compatible `ChangedLamps` addresses. Star Trek configures four node boards and reaches public address `339`; the deliberate compatibility gaps at `145`, `210`, and `275` are not device addresses.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "General illumination outputs",
"address_rules": [{ "minimum": 0, "maximum": 0 }],
"transports": {
"libpinmame": { "channel": "gi" },
"controller_plugin": { "group_id": 256, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
}
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/sam.c; src/wpc/core.c; src/libpinmame/libpinmame.cpp"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,92 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.stern-mpu200",
"authority": "pinmame",
"hardware_family": "Stern MPU-200",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Cabinet, switch-matrix, and synthetic flipper inputs",
"address_rules": [
{ "minimum": -7, "maximum": -5 },
{ "minimum": 1, "maximum": 40 },
{ "minimum": 81, "maximum": 84 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Public input ranges\n\n| Inputs | Public addresses |\n| --- | --- |\n| Five-column by eight-return matrix | `1-40` |\n| Self-test, CPU diagnostic, and sound diagnostic | `-7` through `-5` |\n| Generic VPinMAME flipper-button positions | `81-84` |\n\nAli uses lower-right `82` and lower-left `84`.",
"notes_format": "markdown"
},
{
"id": "physical.input.direct",
"direction": "input",
"kind": "switch",
"label": "Hard-wired physical contacts outside the MPU input API",
"address_rules": [{ "values": [1, 2] }],
"transports": {},
"notes": "#### Profile-local identities\n\n| Address | Contact |\n| --- | --- |\n| `1` | Left flipper end-of-stroke |\n| `2` | Right flipper end-of-stroke |\n\nThese contacts switch the dual-winding flipper circuits directly and are not PinMAME switch addresses.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "MPU option-switch banks S1-S32",
"address_rules": [{ "minimum": 1, "maximum": 32 }],
"transports": { "libpinmame": { "channel": "dip" } }
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Decoder, continuous, and synthetic flipper outputs",
"address_rules": [
{ "minimum": 1, "maximum": 15 },
{ "minimum": 17, "maximum": 20 },
{ "values": [46, 48] }
],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Public outputs\n\n| Outputs | Public addresses |\n| --- | --- |\n| Decoder | `1-15` |\n| Continuous | `17-20` |\n| Generic VPinMAME lower-right flipper callback | `46` |\n| Generic VPinMAME lower-left flipper callback | `48` |\n\nValue `16` is an unaddressable decoder slot.\n\n**Service diagnostics:** Physical service-diagnostic numbering is game wiring and remains a machine-level alias.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Discrete SCR controlled-lamp outputs",
"address_rules": [
{ "minimum": 1, "maximum": 15 },
{ "minimum": 17, "maximum": 31 },
{ "minimum": 33, "maximum": 47 },
{ "minimum": 49, "maximum": 63 }
],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "The `LDA-100` has sixty discrete SCR outputs, not a lamp matrix.\n\n| Group | Public values |\n| --- | --- |\n| 1 | `1-15` |\n| 2 | `17-31` |\n| 3 | `33-47` |\n| 4 | `49-63` |\n\nAddresses `16`, `32`, `48`, and `64` are unaddressable decoder slots.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/by35.c; src/wpc/by35.h; src/wpc/stgames.c; src/wpc/core.c; src/libpinmame/libpinmame.cpp"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,135 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.system-11",
"authority": "pinmame",
"hardware_family": "Williams System 9/11",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Diagnostic buttons, the 8x8 switch matrix, and PinMAME's flipper column",
"address_rules": [
{
"minimum": -7,
"maximum": -4
},
{
"minimum": 1,
"maximum": 64
},
{
"minimum": 81,
"maximum": 88
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix conversion\n\nPublic switches are sequential matrix positions addressed column-major across the whole `1-64` range, not column-times-ten notation. The base PinMAME driver registers `core_swSeq2m`/`core_m2swSeq` for every generation that does not override `MDRV_SWITCH_CONV` (`src/wpc/core.c` `MACHINE_DRIVER_START(PinMAME) MDRV_SWITCH_CONV(core_swSeq2m,core_m2swSeq)`); `src/wpc/s11.c` `MACHINE_DRIVER_START(s11)` imports `PinMAME` and never overrides it, unlike `src/wpc/wpc.c` which does.\n\n`core_swSeq2m(n) = n+7`, so the internal matrix index is `m = n+7`, `column = m/8`, and `row = m%8` (`src/wpc/core.c` `core_swSeq2m`/`core_m2swSeq`/`core_getSw`/`core_setSw`/`core_updInvSw`). Equivalently, for public address `n`:\n\n| Value | Calculation |\n| --- | --- |\n| Column | `((n-1)/8)+1` |\n| Row | `((n-1)%8)+1` (1-indexed) |\n\nColumn 1 is public `1-8`; column 8 is public `57-64`. `src/wpc/s11.c` documents this at the top of its switch-handling code: `'S11 is 1-64, convert to 0-64 (+8), i.e. 1=8, 2=9...'`.\n\n#### Column 1 and diagnostics\n\nColumn 1 (public `1-8`) is not a separate `dedicated switch` namespace the way WPC has one. `SWITCH_UPDATE(s11)` (`src/wpc/s11.c`) loads `coreGlobals.swMatrix[0]` and `[1]` directly from the shared `S11_COMINPORT`/`S11_COMPORTS` keyboard ports (`src/wpc/s11.h`): tilt=`1`, ball-tilt/mux-feedback=`2` (see below), start=`3`, coin1-3=`4-6`, slam tilt=`7`, and high-score-reset=`8`. These still occupy ordinary matrix column 1 and read through the same `core_getSw`/`core_setSw` path as every other address; there is no separate binding group for them.\n\nThe four negative diagnostic addresses are the upper nibble of the same `S11_COMINPORT` port (`src/wpc/s11.h`), landing in matrix column 0 (`m=0..3`) through the identical `n+7` formula:\n\n| Address | Constant |\n| --- | --- |\n| `-7` | `S11_SWADVANCE` |\n| `-6` | `S11_SWUPDN` |\n| `-5` | `S11_SWCPUDIAG` |\n| `-4` | `S11_SWSOUNDDIAG` |\n\nThey are cabinet/service diagnostic buttons, not matrix positions a player-facing definition should place on the playfield.\n\n#### Flipper column\n\nPinMAME keeps the cabinet flipper buttons in its own flipper switch column, `CORE_FLIPPERSWCOL` (internal column 11, `src/wpc/core.h`). The same `core_swSeq2m(n)=n+7` conversion publishes that column at `81-88`:\n\n| Address | Bit | Position |\n| --- | --- | --- |\n| `81` | `CORE_SWLRFLIPEOSBIT` (`0x01`) | Lower right end-of-stroke |\n| `82` | `CORE_SWLRFLIPBUTBIT` (`0x02`) | Lower right button |\n| `83` | `CORE_SWLLFLIPEOSBIT` (`0x04`) | Lower left end-of-stroke |\n| `84` | `CORE_SWLLFLIPBUTBIT` (`0x08`) | Lower left button |\n| `85` | `CORE_SWURFLIPEOSBIT` (`0x10`) | Upper right end-of-stroke |\n| `86` | `CORE_SWURFLIPBUTBIT` (`0x20`) | Upper right button |\n| `87` | `CORE_SWULFLIPEOSBIT` (`0x40`) | Upper left end-of-stroke |\n| `88` | `CORE_SWULFLIPBUTBIT` (`0x80`) | Upper left button |\n\nNo pinned System 9/11 driver sets `FLIP_SOL`: each declares `FLIP_SWNO(l,r)`, `FLIP_SW(FLIP_L)` or no flipper bits at all, so the flippers are cabinet-wired and the CPU drives no flipper coil. `core_updateSw` (`src/wpc/core.c`) then does three things on every update:\n\n- With keyboard handling off (the LibPinMAME default), it reads the two lower button bits from this column as the host wrote them; no driver on this platform sets an `invSw` bit in column 11.\n- It copies `82` into matrix switch `r` and `84` into matrix switch `l` through `core_setSw`, so a host write to `l` or `r` itself is overwritten on the next update. A driver that declares no switch number for a side (`FLIP_SW(FLIP_L)`, a zero in `FLIP_SWNO`, or no flipper bits) gets no copy for that side.\n- While the switched-solenoid enable is on (public `23`, which `s11.c` passes to `core_updateSw` as `locals.ssEn`), it fabricates the synthetic flipper outputs `45/46` from `82` and `47/48` from `84` (`CORE_LRFLIPSOLBITS`, `CORE_LLFLIPSOLBITS`).\n\nA consumer that wants a flipper button to reach the ROM drives `82`/`84`, never the matrix address the game's manual prints for it. The known-working System 11 tables curated here drive exactly these two through VPinMAME's `S11.VBS` (`swLRFlip = 82`, `swLLFlip = 84`); its `swURFlip = 81` and `swULFlip = 83` are script constants that do not follow this mapping, and neither address is read on this platform. Each such definition cites the retained library as its `vpm-script-library.s11-vbs` source.\n\n`locals.flipMask` gains an end-of-stroke bit only from `FLIP_EOS` (implied by `FLIP_SOL`) and an upper button bit only from `FLIP_SW(FLIP_UR)`/`FLIP_SW(FLIP_UL)`. No pinned driver on this platform sets either, so `core_updateSw` never copies `81`, `83` or `85-88` anywhere and PinMAME models no end-of-stroke switch here. A host write to them survives in the column, but the ROM cannot read it there: `s11.c`'s `pia4a_r` reads the matrix only through `core_getSwCol` with an eight-bit column strobe, which reaches columns 1-8. A definition enumLine truncated
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "Country jumper",
"address_rules": [
{
"values": [
0
]
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
},
"notes": "#### Country jumper\n\nSystem 11 exposes exactly one DIP-style configuration bit: a single Country jumper (USA/Germany), read via `core_getDip(0)<<7` on `PIA2 PA7` (`src/wpc/s11.c` `pia2a_r`; `src/wpc/s11.h` `COREPORT_DIPNAME(0x0001,0x0000,\"Country\")`, `MDRV_DIPS(1)` `actually a jumper`).\n\nThis is a physical jumper block, not a multi-bank operator DIP the way Bally MPU AS-2518-35 or WPC games have.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Switched/controlled/special solenoids, the A/C-relay-multiplexed flasher alias, general illumination, the sound-overlay board, and synthetic flipper/ball-shooter outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 22
},
{
"minimum": 23,
"maximum": 24
},
{
"minimum": 25,
"maximum": 32
},
{
"minimum": 33,
"maximum": 44
},
{
"minimum": 45,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### General illumination\n\nSystem 11 has no separate WPC/Whitestar-style `coreGlobals.gi[]` string abstraction at all. `src/wpc/core.h` documents that array as WPC/Whitestar/SAM-only, and `s11.c` never touches it.\n\nGeneral illumination on System 11 is simply an ordinary solenoid address whose per-game bulb-driver metadata happens to be a continuous AC GI type rather than a momentary DC coil type. `MACHINE_INIT(s11)` in `src/wpc/s11.c` contains one `strncasecmp(gn,...)` block per game short name that calls `core_set_pwm_output_type(CORE_MODOUT_SOL0+addr-1, count, CORE_MODOUT_BULB_44_6_3V_AC_REV)`, naming that game's own GI address(es). There is no fixed GI address or count across the platform. A definition must bind its GI devices to this same `pinmame.output.solenoid` group at the address its own game's block (or manual) names, with output kind `gi`, not to a separate GI group/channel.\n\n#### Address map\n\n| Addresses | Behavior |\n| --- | --- |\n| `1-8` | The `A` side of eight switched/momentary solenoids. `src/wpc/core.h` documents `1-8 Standard A-side`; `PIA0:B` drives them through a memory-mapped latch at `0x2200` (`src/wpc/s11.c` `latch2200`/`s11_writemem`). |\n| `9-16` | Eight `controlled` (continuously-driven) solenoids from `PIA0:B` (`src/wpc/s11.c` `pia0b_w`; `PIA0:B` comment `Solenoid 9-16, 12 is usually for multiplexing`). |\n| `17-22` | Six `special` solenoids; see below. |\n| `23` | `CORE_SSFLIPENSOL` / `S11_GAMEONSOL`, an emulator/ROM-internal `flipper and switched-solenoid enable` pulse with no physical driver-board output. Do not bind a playfield device to it. |\n| `24` | Unassigned gap between the special-solenoid enable and the `C`-side alias below. The platform reserves it, but no known driver populates it. |\n| `25-32` | `C`-side relay aliases; see below. |\n| `33-36` | Generic upper-flipper-coil range; see below. |\n| `37-44` | Sound overlay board outer bound; see below. |\n| `45-48` | Synthetic lower-flipper outputs; see below. |\n| `49` | Shared cross-generation `fake solenoid for ball shooter` used by the simulator (`CORE_FIRSTSIMSOL=49`, `src/wpc/core.h`; `sim_getSol`, `src/wpc/core.c`), not System-11-specific. |\n| `50` | Unassigned gap between the simulator slot and the custom-solenoid base. |\n| `51-64` | Custom-solenoid space; see below. |\n\n#### Special solenoids `17-22`\n\nEach special solenoid is driven by one `PIA CA2/CB2` line and gated by a software enable (`PIA0 CB2`, `locals.ssEn`). The PIA-output-to-public-address map is scrambled by silkscreen order and must go through `setSSSol`'s `ssSolNo[0]={5,4,1,2,0,3}` table for Williams hardware (`src/wpc/s11.c` `setSSSol`, `pia1ca2_w`/`pia1cb2_w`/`pia3ca2_w`/`pia3cb2_w`/`pia4ca2_w`/`pia4cb2_w`) rather than being assumed sequential from the PIA read order. Once resolved, it is sequential: silkscreen `SS1/A` to `SS6/F` maps onto public `17-22` in order.\n\n#### `C`-side relay aliases `25-32`\n\nAddresses `25-32` are not eight independent driver transistors. `updsol()` in `src/wpc/s11.c` copies the live low byte of the momentary solenoid word (public `1-8`) into bits `24-31` whenever the mux relay solenoid (`sxx.muxSol`, commonly but not always `12`) is energized. Public `25-32` therefore fire the *same* eight transistors as `1-8`, routed by relay contacts to a second, usually higher-voltage, circuit. This is commonly `#89` 25V flasher bulbs in place of the low-power devices normally wired to `1-8`; `src/wpc/s11.c` `core_set_pwm_output_type(...,CORE_MODOUT_BULB_89_25V_DC_S11)` comments name this `Mux relay` pattern per game.\n\nThis is real System 11 hardware multiplexing, documented on many original driver-board silkscreens as paired `nnA`/`nnC` circuits switched by an A/C select relay, not an emulator artifact. A definition should record the `C`-side device at address `(manual A-side number + 24)`.\n\n#### Generic, sound-overlay, and synthetic outputs\n\n- **Upper flippers (`33-36`):** This is the platform's generic upper-flipper-coil range (`CORE_FIRSTUFLIPSOL=33`). `core_getSol` only serves it for `GEN_ALLWPC`/`GEN_SAM`, so it reads as always-zero for any System 11 game and is only meaningful if a specific game's own custom `getSol` hook or hardware repurposes it. Verify per game rather than assuming flipper hardware.\n- **Sound overlay (`37-44`):** These are `Sound overlay board` outputs per `src/wpc/core.h`'s own `37-41 Sound overlay board` doc comment when a game sets `hw.gameSpecific1 & S11_SNDOVERLAY`. `pia5cb2_w` diverts the sound-command byte away from the sound board and writes it as an up-to-8-bit pulse pattern starting at PWM index `40` (`src/wpc/s11.c` `pia5cb2_w`, `core_write_pwm_output_8b(CORE_MODOUT_SOL0+40,...)`), while `core_getSol`'s own `GEN_ALLS11` branch for public `37-44` reads `coreGlobals.solenoids2` bit `(solNo-37+8)` (`src/wpc/core.c` `core_getSol`). These two internal numbering views do not fully agree with each other in the pinned revision. The exact populated subset -- which Line truncated
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "8x8 lamp matrix and optional auxiliary lamp columns",
"address_rules": [
{
"minimum": 1,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Standard matrix\n\n`coreGlobals.nLamps = 64 + hw.lampCol*8` (`src/wpc/s11.c` `MACHINE_INIT(s11)`). A driver declaring `hw.lampCol=0` -- the common case, and Whirlwind's own value -- models exactly the standard 64-lamp matrix with no auxiliary columns.\n\nThe public numbering convention is the identical column-major sequential scheme documented on the switch group above: `column=((n-1)/8)+1`, `row=((n-1)%8)+1`. It is registered through the same `core_swSeq2m`/`core_m2swSeq` pair reused for `MDRV_LAMP_CONV` (`src/wpc/core.c` `MACHINE_DRIVER_START(PinMAME)`).\n\nUnlike the switch case, this conversion is exercised only for the custom-lamp-column uniqueness assertion at game-init time (`src/wpc/core.c` `CORE_CUSTLAMPCOL`-style check), not by any runtime strobe path. The raw hardware strobe -- `PIA1:A` rows / `PIA1:B` columns (`src/wpc/s11.c` `pia1a_w`/`pia1b_w`) -- writes directly by column/row and never consults a public lamp number at all.\n\n#### Auxiliary columns\n\nA driver declaring `hw.lampCol > 0` adds one additional 8-lamp column per unit at public `65` upward. This profile asserts only the base `1-64` range Whirlwind actually uses.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/s11.c (SWITCH_UPDATE(s11), core_swSeq2m/core_m2swSeq registration path via MACHINE_DRIVER_START(PinMAME), setSSSol, updsol, pia0b_w/pia1a_w/pia1b_w/pia2a_r/pia4a_r/pia4b_w/pia5cb2_w, s11_readmem/s11_writemem, MACHINE_INIT(s11) per-game strncasecmp GI/output-type blocks); src/wpc/s11.h (S11_SWADVANCE/S11_SWUPDN/S11_SWCPUDIAG/S11_SWSOUNDDIAG, S11_COMINPORT/S11_COMPORTS, S11_MUXSW2/S11_SNDOVERLAY gameSpecific1 flags, COREPORT_DIPNAME Country jumper); src/wpc/core.h (core_tGameData sxx.muxSol/sxx.ssSw, CORE_FIRSTSSSOL=17, CORE_SSFLIPENSOL=23, CORE_FIRSTEXTSOL=37, CORE_FIRSTUFLIPSOL=33, CORE_FIRSTLFLIPSOL=45, CORE_FIRSTSIMSOL=49, CORE_FIRSTCUSTSOL=51, CORE_MAXSOL=64, '1-8 Standard A-side / 9-16 Standard / 17-22 Special / 23 Flipper & Switched Sol. Enable / 25-32 Standard C-side / 37-41 Sound overlay board' doc comment); src/wpc/core.c (core_swSeq2m/core_m2swSeq/core_getSw/core_setSw/core_updInvSw, core_getSol GEN_ALLS11 branch, core_updateSw synthetic-flipper-solenoid fallback, MACHINE_DRIVER_START(PinMAME) MDRV_SWITCH_CONV/MDRV_LAMP_CONV); src/wpc/gen.h (GEN_S11/GEN_S11X/GEN_S11A/GEN_S11B/GEN_S11B2/GEN_S11C/GEN_S9/GEN_ALLS11); src/libpinmame/libpinmame.h (PINMAME_HARDWARE_GEN_S11* constants, byte-identical to gen.h)"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,126 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.system-6",
"authority": "pinmame",
"hardware_family": "Williams System 6",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Diagnostic buttons, the 8x8 switch matrix, and synthetic flipper-button positions",
"address_rules": [
{
"minimum": -7,
"maximum": -3
},
{
"minimum": 1,
"maximum": 64
},
{
"minimum": 81,
"maximum": 88
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix conversion\n\n`src/wpc/s6.c` `MACHINE_DRIVER_START(s6)` imports `PinMAME` and installs no switch or lamp converter of its own, so System 6 inherits PinMAME's sequential `core_swSeq2m`/`core_m2swSeq` (`src/wpc/core.c`). Public switches are therefore sequential matrix positions addressed column-major, not column-times-ten notation:\n\n| Value | Calculation |\n| --- | --- |\n| Column | `((n-1)/8)+1` |\n| Row | `((n-1)%8)+1` |\n\nColumn 1 is public `1-8` and column 8 is public `57-64`. The ROM strobes one column at a time through `PIA 1` port B (`s6_swcol_w`) and reads the eight rows back through port A (`s6_swrow_r`).\n\n#### Column 1 and the diagnostic column\n\nColumn 1 (public `1-8`) is an ordinary matrix column that happens to carry the cabinet switches. When PinMAME's own keyboard handling is enabled, `SWITCH_UPDATE(s6)` overwrites it every frame from the `S6_COMPORTS` port (`src/wpc/s6.h`): tilt `1`, ball-roll tilt `2`, start `3`, coin 1-3 `4-6`, slam tilt `7`, high-score reset `8`. With keyboard handling off, as under LibPinMAME and VPinMAME, the consumer writes these addresses directly.\n\nThe five negative addresses are internal matrix column 0 through the same `n+7` formula and come from the upper byte of the same port:\n\n| Address | Constant | Hardware |\n| --- | --- | --- |\n| `-7` | `S6_SWADVANCE` | Advance button, sampled into `PIA 0` `CA1` on every IRQ |\n| `-6` | `S6_SWUPDN` | Auto-Up/Manual-Down toggle, sampled into `PIA 0` `CB1`; public level `1` is Auto-Up |\n| `-5` | `S6_SWCPUDIAG` | CPU-board diagnostic button, wired to the NMI line |\n| `-4` | `S6_SWSOUNDDIAG` | Sound-board diagnostic button |\n| `-3` | `S6_ENTER` | Master Command Enter; `s6_dips_r` returns the function switches only while it is held |\n\nThey are service controls in the coin door or on the boards, never playfield positions.\n\n#### Flipper buttons\n\nSystem 6 flippers are not CPU-driven: the cabinet buttons switch the coils directly and the ROM only enables them. PinMAME still keeps its generic flipper column at internal column 11, which the sequential converter publishes at `81-88`; `CORE_SWLRFLIPBUTBIT` is public `82` and `CORE_SWLLFLIPBUTBIT` is public `84` (`src/wpc/core.h`). `core_updateSw` copies those two bits into the matrix addresses a game names with `FLIP_SWNO(left,right)`, and a zero argument means no copy. It also fabricates the synthetic flipper outputs `45-48` from them whenever the game-on enable is set (see the solenoid group). No System 6 driver declares `FLIP_SOL` or an `FLIP_EOS` bit, so the end-of-stroke positions `81`, `83`, `85` and `87` and the upper-flipper buttons `86` and `88` carry nothing.\n\n#### Polarity\n\nEvery System 6 `INITGAMEFULL` in `src/wpc/s6games.c` aggregate-initializes the per-game `wpc` struct as `{{0}}`, so the per-game inverted-switch mask is zero and PinMAME normalizes nothing. The public level is the raw closed-equals-`1` level of the switch.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "Sound-board option switch and the CPU-board function and Master Command banks",
"address_rules": [
{
"minimum": 1,
"maximum": 2
},
{
"minimum": 9,
"maximum": 24
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
},
"notes": "#### Addressing\n\n`MDRV_DIPS(8+16)` declares twenty-four DIP bits. A public DIP address is `bank * 8 + bit + 1`, where `bank` is the `PinmameSetDIP` bank and `bit` the bit within that bank's byte (`core_getDip`, `src/wpc/core.c`).\n\n| Addresses | Bank and bits | `S6_COMPORTS` label | Consumer |\n| --- | --- | --- | --- |\n| `1-2` | bank 0, bits 0-1 | `Sound Dip 1`, `Sound Dip 2` | the sound board; `src/wpc/wmssnd.c` folds them into bits 5 and 6 of the sound-command byte it presents to the sound CPU |\n| `9-16` | bank 1 | `F1`-`F8` | `s6_dips_r`, strobe positions 0 and 1 |\n| `17-24` | bank 2 | `D1`-`D8` | `s6_dips_r`, strobe positions 2 and 3 |\n\nBank 0 bits 2-7 are not declared.\n\n#### How the ROM reads the CPU-board banks\n\n`s6_dips_r` returns a four-bit nibble selected by the low two bits of the display strobe position, and only while Master Command Enter (`-3`) is held; the value is inverted because the ROM expects `on=0`. Strobe positions 0-1 return the low and high nibble of bank 1 and positions 2-3 the low and high nibble of bank 2. The source comment `s6 games only want dipcol 2` records that the System 6 ROMs sample only the low nibble of bank 2 (`D1`-`D4`). Which physical switch and function each bit carries is game documentation; a definition must cite its own manual rather than this profile.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard and special solenoid drivers, sound-command lines, the game-on enable, and synthetic flipper outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 23
},
{
"minimum": 45,
"maximum": 48
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Address map\n\n| Addresses | Behavior |\n| --- | --- |\n| `1-8` | Standard solenoid drivers on `PIA 3` port A (`s6_sol1_8_w`). |\n| `9-16` | Standard solenoid drivers on `PIA 3` port B (`s6_sol9_16_w`). The same byte, inverted, is the sound-board command (`sndbrd_0_data_w(0, ~data)`), so on System 6 games the low lines of this port normally carry sound commands rather than coils; the source comment says `9-13 used for sound`. Which addresses a game spends on sound is game documentation. |\n| `17-22` | Six special solenoids; see below. |\n| `23` | `CORE_SSFLIPENSOL`: the `PIA 3` `CB2` game-on signal (`s6_gameon_w`), published whenever the ROM enables play. On the hardware this line energizes the driver board's flipper relay and enables the special solenoids. |\n| `24-44` | Not published. `core_getSol` reads `coreGlobals.solenoids` for `1-28`, where System 6 sets only bits `0-22`, and returns `0` for `29-44` because the 29-44 branches serve only WPC, System 11, SAM and Whitestar generations. |\n| `45-48` | Synthetic lower-flipper outputs; see below. |\n\nAddresses `49-50` belong to PinMAME's built-in simulator (`sim_getSol`), which no System 6 driver populates, and no System 6 driver declares `hw.getSol` for the custom range.\n\n#### Special solenoids `17-22`\n\nThe six special solenoids are driven from the `CA2`/`CB2` lines of the four PIAs (`s6_specsol1_w` to `s6_specsol6_w`) and gated by the game-on enable. `setSSSol` indexes `CORE_FIRSTSSSOL + n` directly, so special solenoid `n` is public `16 + n` with no permutation, unlike System 11 and Data East. Each is also published when the switch named in the game's `sxx.ssSw[n-1]` closes while the enable is set (`s6_vblank`), which models the hardware in which that playfield switch fires the coil itself. `sxx.ssSw` is per-game data from the fourth to ninth `INITGAMEFULL` arguments in `src/wpc/s6games.c`, and a zero entry means the slot is not switch-driven.\n\n#### Synthetic flipper outputs `45-48`\n\nNo System 6 driver declares `FLIP_SOL`, so `core_updateSw` fabricates flipper state in `coreGlobals.solenoids2` from the synthetic flipper buttons at switch `82` (right) and `84` (left) whenever the game-on enable is set. `45`/`46` follow the right button and `47`/`48` the left. There is no driver-board output behind any of them: the physical flipper coils are switched by the cabinet buttons through the flipper relay.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "8x8 lamp matrix",
"address_rules": [
{
"minimum": 1,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix addressing\n\n`PIA 2` port B selects lamp columns and port A drives the rows active-low: `s6_lampcol_w` stores the column byte as written, and `s6_lamprow_w` stores the row byte inverted (`~data`). `core_setLamp` places column bit `c` at `lampMatrix[c]`, and the public lamp number read back through `vp_getLamp` is `lamp2m(n) - 8 = n - 1`. So public lamp = `(column - 1) * 8 + row`, with column 1 at `1-8` and column 8 at `57-64`. System 6 declares no auxiliary lamp columns.\n\n#### General illumination\n\nSystem 6 has no general-illumination controller channel. `coreGlobals.gi[]` is written only by WPC, Whitestar and SAM drivers, and `s6.c` never touches it. System 6 games feed their general illumination from an unswitched transformer winding.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"locator": "src/wpc/s6.c (s6_pia PIA wiring, s6_dips_r, s6_swrow_r/s6_swcol_w, s6_lampcol_w/s6_lamprow_w, s6_sol1_8_w/s6_sol9_16_w, setSSSol/s6_specsol1_w-s6_specsol6_w/s6_gameon_w, s6_vblank, SWITCH_UPDATE(s6), MACHINE_DRIVER_START(s6) MDRV_DIPS(8+16)); src/wpc/s6.h (S6_COMPORTS, S6_SWADVANCE/S6_SWUPDN/S6_SWCPUDIAG/S6_SWSOUNDDIAG/S6_ENTER); src/wpc/s6games.c (INITGAMEFULL macro: GEN_S6, FLIP_SWNO, zero wpc struct, sxx.ssSw); src/wpc/core.c (core_swSeq2m/core_m2swSeq, core_setLamp, core_getDip, core_updateSw, core_getSol); src/wpc/core.h (CORE_FIRSTSSSOL=17, CORE_SSFLIPENSOL=23, CORE_FIRSTLFLIPSOL=45, CORE_FLIPPERSWCOL=11, CORE_SWLRFLIPBUTBIT/CORE_SWLLFLIPBUTBIT); src/wpc/vpintf.c (vp_getLamp lamp2m-8); src/wpc/wmssnd.c (s67s sound command bits 5-6 from core_getDip(0)); src/wpc/gen.h (GEN_S6)"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,130 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.system-7",
"authority": "pinmame",
"hardware_family": "Williams System 7",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Diagnostic buttons, the 8x8 switch matrix, and synthetic flipper-button positions",
"address_rules": [
{
"minimum": -7,
"maximum": -3
},
{
"minimum": 1,
"maximum": 64
},
{
"minimum": 81,
"maximum": 88
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix conversion\n\n`src/wpc/s7.c` `MACHINE_DRIVER_START(s7)` imports `PinMAME` and installs no switch or lamp converter of its own, so System 7 inherits PinMAME's sequential `core_swSeq2m`/`core_m2swSeq` (`src/wpc/core.c`). Public switches are sequential matrix positions addressed column-major, not column-times-ten notation:\n\n| Value | Calculation |\n| --- | --- |\n| Column | `((n-1)/8)+1` |\n| Row | `((n-1)%8)+1` |\n\nColumn 1 is public `1-8` and column 8 is public `57-64`. The ROM strobes one column at a time through `PIA 4` port B (`pia4b_w`) and reads the eight rows back through port A (`pia4a_r`, which returns `core_getSwCol` unchanged).\n\n#### Column 1 and the diagnostic column\n\nColumn 1 (public `1-8`) is an ordinary matrix column that carries the cabinet switches. When PinMAME's own keyboard handling is enabled, `SWITCH_UPDATE(s7)` overwrites it every frame from the `S7_COMPORTS` port (`src/wpc/s7.h`): tilt `1`, ball tilt `2`, start `3`, coin 1-3 `4-6`, slam tilt `7`, high-score reset `8`. With keyboard handling off, as under LibPinMAME and VPinMAME, the consumer writes these addresses directly.\n\nThe five negative addresses are internal matrix column 0 through the same `n+7` formula and come from the upper byte of the same port:\n\n| Address | Constant | Hardware |\n| --- | --- | --- |\n| `-7` | `S7_SWADVANCE` | Advance button, sampled into `PIA 3` `CA1` on every IRQ (`s7_irqline`) |\n| `-6` | `S7_SWUPDN` | Auto-Up/Manual-Down toggle, sampled into `PIA 3` `CB1`; public level `1` is Auto-Up |\n| `-5` | `S7_SWCPUDIAG` | CPU-board diagnostic button, wired to the NMI line |\n| `-4` | `S7_SWSOUNDDIAG` | Sound-board diagnostic button |\n| `-3` | `S7_ENTER` | Master Command Enter; `s7_dips_r` returns the DIP banks only while it is held |\n\nThey are service controls in the coin door or on the boards, never playfield positions.\n\n#### Flipper buttons\n\nSystem 7 flippers are not CPU-driven: the cabinet buttons switch the coils directly and the ROM only enables them through the game-on line. PinMAME still keeps its generic flipper column at internal column 11, which the sequential converter publishes at `81-88`; `CORE_SWLRFLIPBUTBIT` is public `82` and `CORE_SWLLFLIPBUTBIT` is public `84` (`src/wpc/core.h`). `s7_vblank` calls `core_updateSw(s7locals.ssEn)`, which copies those two bits into the matrix addresses a game names with `FLIP_SWNO(left,right)` (a zero argument means no copy) and fabricates the synthetic flipper outputs `45-48` from them while the game-on enable is set (see the solenoid group). No System 7 driver declares `FLIP_SOL` or an `FLIP_EOS` bit, so the end-of-stroke positions `81`, `83`, `85` and `87` and the upper-flipper buttons `86` and `88` carry nothing; a game with upper flippers wires them to the same cabinet buttons.\n\n#### Polarity\n\n`core_setSw` writes each switch into the matrix through the per-game inverted-switch mask (`coreGlobals.invSw`, copied from `core_gameData->wpc.invSw`), and `pia4a_r` hands the ROM that matrix byte unchanged through `core_getSwCol`. `INITGAMEFULL` in `src/wpc/s7games.c` aggregate-initializes the mask as `{{0}}`, so for every game declared through it PinMAME normalizes nothing and the public level is the raw closed-equals-`1` level of the switch. Some drivers declare their own `core_tGameData` instead: Hyperball, Spellbinder, Defender and Rat Race in `src/wpc/s7games.c` (Hyperball, Spellbinder and Rat Race with a nonzero mask), and Black Knight and Time Fantasy in their simulator files under `src/wpc/sims/s7/full/`. Read each game's own game data for its mask before relying on this.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "Sound-board option switch and the CPU-board function and Master Command banks",
"address_rules": [
{
"minimum": 1,
"maximum": 2
},
{
"minimum": 9,
"maximum": 24
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
},
"notes": "#### Addressing\n\n`MDRV_DIPS(8+16)` declares twenty-four DIP bits. A public DIP address is `bank * 8 + bit + 1`, where `bank` is the `PinmameSetDIP` bank and `bit` the bit within that bank's byte (`core_getDip`, `src/wpc/core.c`).\n\n| Addresses | Bank and bits | `S7_COMPORTS` label | Consumer |\n| --- | --- | --- | --- |\n| `1-2` | bank 0, bits 0-1 | `Sound Dip 1`, `Sound Dip 2` | the sound board; `s67s_cmd_w` in `src/wpc/wmssnd.c` folds them into the sound-command byte it presents to the sound CPU, except on `s7SND` (the Thunderball prototypes), whose `SNDBRD_S7S_ND` board passes seven command bits and ignores both, and on `s7RR` (Rat Race), which drives a System 9 sound board instead |\n| `9-16` | bank 1 | `F1`-`F8` | `s7_dips_r`, strobe positions 0 and 1 |\n| `17-24` | bank 2 | `D1 Clear Audits`, `D2 Reset Defaults`, `D3 Auto-Cycle Mode`, `D4`-`D8` | `s7_dips_r`, strobe positions 2 and 3 |\n\nBank 0 bits 2-7 are not declared. `s7RR` (Rat Race) declares `MDRV_DIPS(8)` only.\n\n#### How the ROM reads the CPU-board banks\n\n`s7_dips_r` returns a four-bit nibble on `PIA 3` port A selected by the low two bits of the display strobe position, and only while Master Command Enter (`-3`) is held; the value is inverted because the ROM expects `on=0`. Strobe positions 0-1 return the low and high nibble of bank 1 and positions 2-3 those of bank 2. Which physical switch and function each bit carries, and which bits a ROM actually samples, is game documentation; a definition must cite its own manual rather than this profile.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard and special solenoid drivers, the game-on enable, synthetic flipper outputs, and Defender's multiplexed solenoids",
"address_rules": [
{
"minimum": 1,
"maximum": 25
},
{
"minimum": 45,
"maximum": 48
},
{
"minimum": 51,
"maximum": 60
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Address map\n\n| Addresses | Behavior |\n| --- | --- |\n| `1-8` | Standard solenoid drivers on `PIA 1` port A (`pia1a_w`). |\n| `9-16` | Standard solenoid drivers on `PIA 1` port B (`pia1b_w`). On `s7S6` machines (System 7 CPU with a System 6 sound board) the same byte, inverted, is also the sound-board command. |\n| `17-24` | Eight special solenoids; see below. |\n| `25` | `S7_GAMEONSOL`: the game-on enable (`PIA 1` `CB2`, `pia1cb2_w` stores it in `ssEn`). `s7_vblank` publishes it whenever the ROM enables play (Rat Race excepted; see below). On the hardware it energizes the flipper relay and enables the special solenoids. |\n| `26-44` | Not published. `core_getSol` reads `coreGlobals.solenoids` for `1-28`, where System 7 sets only bits `0-24`, and returns `0` for `29-44` because those branches serve only WPC, System 11, pinHeck, SAM and WPC-95 generations. |\n| `45-48` | Synthetic lower-flipper outputs; see below. |\n| `51-60` | Defender only: ten multiplexed custom solenoids returned by its `hw.getSol` (`dfndrCustSol`) while its mux solenoid is active. No other System 7 driver declares `hw.getSol`. |\n\n`s7RR` (Rat Race) differs from this map. It has no `PIA 1`: its ROM writes solenoids `1-8` as one byte at `$2200` (`rr_sol_w`), so nothing writes `9-16` or the `pia1cb2_w` enable. `MACHINE_INIT(rr)` sets `ssEn = 1` at reset, so `s7_vblank` publishes `25` from reset on, and `setSSSol` publishes its special solenoids non-inverted and without the enable.\n\nAddresses `49-50` belong to PinMAME's built-in simulator (`sim_getSol`), which reports only its own shooter-release state while the keyboard-driven simulator runs and is never driven under LibPinMAME.\n\n#### Special solenoids `17-24`\n\nThe special solenoids are driven from the `CA2`/`CB2` lines of the PIAs and gated by the game-on enable (`setSSSol`). Unlike System 6, the PIA lines map to slots through a fixed permutation, and slot `n` is published at `CORE_FIRSTSSSOL + n`, that is public `17 + n`:\n\n| PIA line | Handler | Slot | Public |\n| --- | --- | --- | --- |\n| `PIA 2` `CB2` | `pia2cb2_w` | 0 | `17` |\n| `PIA 2` `CA2` | `pia2ca2_w` | 1 | `18` |\n| `PIA 4` `CB2` | `pia4cb2_w` | 2 | `19` |\n| `PIA 4` `CA2` | `pia4ca2_w` | 3 | `20` |\n| `PIA 1` `CA2` | `pia1ca2_w` | 4 | `21` |\n| `PIA 3` `CB2` | `pia3cb2_w` | 5 | `22` |\n| `PIA 0` `CB2` | `pia0cb2_w` | 6 | `23` |\n| `PIA 0` `CA2` | `pia0ca2_w` | 7 | `24` |\n\nWhich PIA line drives which board driver, and so which printed special-solenoid number a public address carries, is board and game documentation: prove it per game, for example with the ROM's own solenoid test, which displays each step's number as it pulses the address. Each slot is also published while the switch named in the game's `sxx.ssSw[n]` is closed and the enable is set (`s7_vblank`), which models the hardware in which that playfield switch fires the coil itself. `sxx.ssSw` is per-game data; `INITGAMEFULL` fills the first six entries, a driver with its own `core_tGameData` may fill fewer, and a zero entry means the slot is not switch-driven. Rat Race (`s7RR`) bypasses the enable and publishes its special solenoids non-inverted.\n\n#### Synthetic flipper outputs `45-48`\n\nNo System 7 driver declares `FLIP_SOL`, so `core_updateSw` fabricates flipper state in `coreGlobals.solenoids2` from the synthetic flipper buttons at switch `82` (right) and `84` (left) whenever the game-on enable is set. `45`/`46` follow the right button and `47`/`48` the left. There is no driver-board output behind any of them: the physical flipper coils are switched by the cabinet buttons through the flipper relay.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "8x8 lamp matrix, and Hyperball's four extra lamp columns",
"address_rules": [
{
"minimum": 1,
"maximum": 96
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix addressing\n\n`PIA 2` port B selects lamp columns and port A drives the rows active-low: `pia2b_w` stores the column byte as written, and `pia2a_w` stores the row byte inverted (`~data`). `core_setLamp` places column bit `c` at `lampMatrix[c]`, and the public lamp number read back through `vp_getLamp` is `lamp2m(n) - 8 = n - 1`. So public lamp = `(column - 1) * 8 + row`, with column 1 at `1-8` and column 8 at `57-64`.\n\nHyperball and Spellbinder declare four extra lamp columns (`hw.lampCol = 4`), which `pia1a_w` fills from the solenoid port while the lamp strobe selects them; they are published at `65-96`. No other System 7 driver uses them.\n\n#### General illumination\n\nSystem 7 has no general-illumination controller channel. `s7.c` never writes `coreGlobals.gi[]`, so no System 7 driver publishes a GI channel. A game that switches its general illumination does so through one of its own solenoid drivers and a relay.",
"notes_format": "markdown"
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "97aa922bf8e4b6970126192ec1ac1fb0305a4f62",
"locator": "src/wpc/s7.c (s7_pia PIA wiring, s7_irqline, s7_vblank game-on and sxx.ssSw loop, setSSSol and the pia0ca2_w-pia4cb2_w special-solenoid handlers, pia1cb2_w game-on, updsol/dfndrCustSol, pia1a_w Hyperball lamp columns, pia2a_w/pia2b_w lamps, s7_dips_r, pia4a_r/pia4b_w switches, SWITCH_UPDATE(s7), MACHINE_DRIVER_START(s7) MDRV_DIPS(8+16), s7SND/MACHINE_INIT(s7nd), s7RR/rr_sol_w/MACHINE_INIT(rr)); src/wpc/wmssnd.c (s67s_cmd_w sound-DIP folding); src/wpc/s7.h (S7_COMPORTS, S7_SWADVANCE/S7_SWUPDN/S7_SWCPUDIAG/S7_SWSOUNDDIAG/S7_ENTER, S7_GAMEONSOL); src/wpc/s7games.c (INITGAMEFULL, the Hyperball, Defender and Rat Race game data); src/wpc/core.c (core_swSeq2m/core_m2swSeq, core_getSwCol, core_setLamp, core_getDip, core_updateSw, core_getSol); src/wpc/core.h (CORE_FIRSTSSSOL=17, CORE_FIRSTLFLIPSOL=45, CORE_FLIPPERSWCOL=11, CORE_SWLRFLIPBUTBIT/CORE_SWLLFLIPBUTBIT); src/wpc/sim.c (sim_getSol); src/wpc/vpintf.c (vp_getLamp lamp2m-8); src/wpc/gen.h (GEN_S7)"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,87 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.whitestar",
"authority": "pinmame",
"hardware_family": "Sega/Stern Whitestar",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Sequential matrix, cabinet-service, and flipper-column inputs",
"address_rules": [
{ "minimum": -3, "maximum": 0 },
{ "minimum": 1, "maximum": 64 },
{ "minimum": 81, "maximum": 88 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Public input ranges\n\nWhitestar uses PinMAME's sequential switch conversion.\n\n| Inputs | Public addresses |\n| --- | --- |\n| Eight-by-eight playfield/cabinet matrix | `1-64` |\n| Coin-door memory protect | `-3` |\n| Red/green/black coin-door service buttons | `-2` / `-1` / `0` |\n| Right EOS / right button / left EOS / left button | `81-84` |\n| Fifth dedicated input for games with an upper flipper | `88` |\n\nAddresses `85-87` are explicit generic flipper-column holes.\n\n#### Polarity\n\nThe platform leaves the per-game `invSw` mask zero, so physical normally-closed/opto construction remains a per-game evidence question. `inversion_applied_by_emulator` only states that consumers must not re-invert the public API state.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board country configuration bits",
"address_rules": [{ "minimum": 1, "maximum": 8 }],
"transports": { "libpinmame": { "channel": "dip" } },
"notes": "#### Country selector\n\nThe physical `SW300` country selector consumes the low five bits.\n\nThe eight-address LibPinMAME DIP contract is retained so definitions can enumerate the complete public bank and mark bits `6-8` unused.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Main, auxiliary, synthetic-state, and generic flipper outputs",
"address_rules": [{ "minimum": 1, "maximum": 50 }],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Main and flipper outputs\n\nPhysical main-board `Q1-Q14` and `Q17-Q32` retain their public numbers. Physical `Q15`/`Q16` are removed from public `15`/`16` and exposed through legacy lower-flipper pairs:\n\n| Physical output | Side | Power-phase address | Canonical callback |\n| --- | --- | --- | --- |\n| `Q16` | Right | `45` | `46` |\n| `Q15` | Left | `47` | `48` |\n\nPinMAME synthesizes each canonical callback's hold state whenever its power bit is active, so a recreation must not create duplicate flipper devices.\n\n#### Synthetic and auxiliary outputs\n\n- Public `15` is PinMAME's synthetic fast-flip/game-on state, and public `16` is its unused companion slot.\n- Whitestar auxiliary boards use `33-36`. Board `520-5068-01` exposes three outputs at `33-35` and leaves `36` unused.\n- Addresses `37-44` are reserved compatibility holes, `49` is the simulation shooter slot, and `50` is reserved.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Controlled-lamp matrix and game-specific auxiliary lamp columns",
"address_rules": [{ "minimum": 1, "maximum": 336 }],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Controlled-lamp matrix\n\nWhitestar reports the eight-by-ten controlled-lamp matrix as sequential public addresses `1-80`, with addresses ordered across the eight columns before advancing to the next return row.\n\n#### Shared transport ceiling\n\nPinMAME sizes this shared transport to `64 + (lampCol * 8)`. `src/wpc/bowlgames.c` declares `lampCol=34` in `coinGameData`, shared by the `titanic` and `monopred` coin-dropper drivers, hence the platform profile ceiling of `336`.\n\nA machine definition must enumerate only addresses its own hardware declaration and game-specific driver writes establish; the profile ceiling never creates physical devices.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "General-illumination relay state",
"address_rules": [{ "minimum": 0, "maximum": 0 }],
"transports": {
"libpinmame": { "channel": "gi" },
"controller_plugin": { "group_id": 256, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "PinMAME exposes Whitestar's GI relay as aggregate channel 0 even when the cabinet has several separately fused physical illumination strings behind that relay."
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/se.h; src/wpc/se.c; src/wpc/segames.c; src/wpc/bowlgames.c coinGameData, titanic, monopred; src/wpc/core.h; src/wpc/core.c; src/libpinmame/libpinmame.cpp"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,223 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.wpc-95",
"authority": "pinmame",
"hardware_family": "Williams WPC-95",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Coin-door, switch-matrix, and Fliptronic flipper inputs",
"address_rules": [
{
"minimum": 1,
"maximum": 8
},
{
"minimum": 11,
"maximum": 18
},
{
"minimum": 21,
"maximum": 28
},
{
"minimum": 31,
"maximum": 38
},
{
"minimum": 41,
"maximum": 48
},
{
"minimum": 51,
"maximum": 58
},
{
"minimum": 61,
"maximum": 68
},
{
"minimum": 71,
"maximum": 78
},
{
"minimum": 81,
"maximum": 88
},
{
"minimum": 111,
"maximum": 118
}
],
"transports": {
"libpinmame": {
"channel": "switch"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Cabinet inputs\n\nAddresses `1-8` are the four coin chutes and the four coin-door service buttons in printed row order.\n\n#### Matrix inputs\n\nPublic matrix addresses use WPC column/row notation `11-88`, where the left digit is the drive column and the right digit is the return row; values ending in `9` or `0` are not matrix positions.\n\n#### Fliptronic inputs\n\nWPC-95 always has Fliptronic flipper inputs, so `111-118` are the eight EOS/button positions in `WPC_swF1..WPC_swF8` order:\n\n| Address | Position |\n| --- | --- |\n| `111` | lower-right EOS |\n| `112` | lower-right button |\n| `113` | lower-left EOS |\n| `114` | lower-left button |\n| `115` | upper-right EOS |\n| `116` | upper-right button |\n| `117` | upper-left EOS |\n| `118` | upper-left button |\n\nWPC-95 reads that column through `WPC_FLIPPERSW95` with a hardware inversion, so the public state is already normalized and must not be re-inverted.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board option and country configuration bits",
"address_rules": [
{
"minimum": 1,
"maximum": 8
}
],
"transports": {
"libpinmame": {
"channel": "dip"
}
}
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard, state, Fliptronic, LPDC, and game-specific custom outputs",
"address_rules": [
{
"minimum": 1,
"maximum": 64
}
],
"transports": {
"libpinmame": {
"channel": "solenoid"
},
"controller_plugin": {
"group_id": 1,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Standard and state outputs\n\nWPC-95 exposes standard drivers `1-28`; `29-30` mirror two J111 general-purpose bits; `31` is PinMAME's synthetic game-on state, taken from the driver's fast-flip RAM flag when `wpc_set_fastflip_addr` is set; and `32` is always zero.\n\n| Public addresses | Behavior |\n| --- | --- |\n| `33-36` | Fliptronic upper-flipper circuits: `33`/`34` upper-right power/hold and `35`/`36` upper-left power/hold. Games may drive non-flipper devices through them. |\n| `37-40` and `41-44` | `37-40` are the WPC-95 LPDC general-purpose outputs added on the integrated board. PinMAME duplicates them at `41-44` for backward compatibility, so one physical device reports on two public addresses. |\n| `45-48` | Fliptronic lower-flipper circuits: `45`/`46` lower-right power/hold and `47`/`48` lower-left power/hold. |\n| `49` | PinMAME's simulator-only ball-shooter channel. |\n| `50` | Reserved before the first custom-output boundary. |\n\n#### Custom outputs\n\nAbove that boundary, `51-64` are the game-specific custom solenoids a driver may publish through its own `getSol` handler. PinMAME serves as many as the driver's `core_tGameData custSol` count declares, and a game may use them to expose an already-declared circuit a second time. Attack From Mars is the WPC-95 example with `custSol=3`. A definition declares only the addresses its own machine publishes.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Eight-by-eight controlled-lamp matrix with optional auxiliary columns",
"address_rules": [
{
"minimum": 11,
"maximum": 18
},
{
"minimum": 21,
"maximum": 28
},
{
"minimum": 31,
"maximum": 38
},
{
"minimum": 41,
"maximum": 48
},
{
"minimum": 51,
"maximum": 58
},
{
"minimum": 61,
"maximum": 68
},
{
"minimum": 71,
"maximum": 78
},
{
"minimum": 81,
"maximum": 88
},
{
"minimum": 91,
"maximum": 98
},
{
"minimum": 101,
"maximum": 108
},
{
"minimum": 111,
"maximum": 118
},
{
"minimum": 121,
"maximum": 128
},
{
"minimum": 131,
"maximum": 138
},
{
"minimum": 141,
"maximum": 148
}
],
"transports": {
"libpinmame": {
"channel": "lamp"
},
"controller_plugin": {
"group_id": 512,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "#### Matrix conversion\n\nPinMAME applies `wpc_sw2m`/`wpc_m2sw` conversion to lamps. `ChangedLamps` therefore reports public matrix addresses `11-88` rather than sequential indices `1-64`, where the left digit is the drive column and the right digit is the return row.\n\n#### Auxiliary columns\n\nA driver may declare additional lamp columns through `core_tGameData lampCol`; `wpc_m2sw` continues the same column-times-ten notation.\n\n| Auxiliary column | Public addresses |\n| --- | --- |\n| First | `91-98` |\n| Second | `101-108` |\n| Third | `111-118` |\n| Fourth | `121-128` |\n| Fifth | `131-138` |\n| Sixth | `141-148` |\n\nAttack From Mars declares `lampCol=2` for its chase board. The Champion Pub declares `lampCol=4`; its four 4094 parallel callbacks populate internal columns 10, 8, 11 and 9, exposed as public columns 11, 9, 12 and 10. Safe Cracker declares `lampCol=6`; its six 4094 parallel callbacks fill internal columns 8-13, public `91-148`, from serial lines the ROM shifts out on LPDC outputs `37-40`, and its ROM's T.8 SINGLE LAMPS TEST steps through all 48 as the backbox lamps L24-L1 and L48-L25. The exported auxiliary bits and the fitted LED board's emitter count are separate facts. A machine definition enumerates its own declared columns and gives each address an explicit disposition.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "Five general-illumination strings",
"address_rules": [
{
"minimum": 0,
"maximum": 4
}
],
"transports": {
"libpinmame": {
"channel": "gi"
},
"controller_plugin": {
"group_id": 256,
"contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228"
}
},
"notes": "Public GI addresses are zero-based 0-4 and correspond to the manuals' printed strings 01-05."
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"locator": "src/wpc/sims/wpc/prelim/cp.c cpGameData lampCol=4, parallel_0_out/parallel_1_out/parallel_2_out/parallel_3_out internal lampMatrix columns 10/8/11/9; src/wpc/wpc.c wpc_m2sw public column-times-ten conversion"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/core.h WPC solenoid numbering comment and CORE_FIRSTEXTSOL/CORE_FIRSTUFLIPSOL/CORE_FIRSTLFLIPSOL/CORE_FLIPPERSWCOL; src/wpc/core.c core_getSol WPC95 37..44 duplication; src/wpc/wpc.c WPC_FLIPPERSW95 inversion, WPC_SOLENOID1 LPDC mapping, and fast-flip game-on state; src/wpc/wpc.h WPC_swF1..WPC_swF8; src/libpinmame/libpinmame.h PINMAME_HARDWARE_GEN_WPC95=0x80; src/wpc/core.h CORE_FIRSTCUSTSOL/CORE_MAXSOL/CORE_CUSTLAMPCOL; src/wpc/wpc.c wpc_m2sw column notation"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,106 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.wpc-alpha",
"authority": "pinmame",
"hardware_family": "Williams WPC alphanumeric",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Coin-door, switch-matrix, and flipper inputs",
"address_rules": [
{ "minimum": 1, "maximum": 8 },
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 111, "maximum": 118 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Cabinet inputs\n\nAddresses `1-8` are the four coin inputs and four coin-door service buttons.\n\n#### Matrix inputs\n\nPublic matrix addresses use WPC column/row notation `11-88`; values ending in `9` or `0` are not matrix positions.\n\n#### Generic flipper inputs\n\nThe generic flipper column is `111-118` in EOS/button pairs. Pre-Fliptronics games can map their physical EOS switches into the regular matrix while retaining generic cabinet-button inputs.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board option and country configuration bits",
"address_rules": [{ "minimum": 1, "maximum": 8 }],
"transports": { "libpinmame": { "channel": "dip" } }
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard, state, and generic flipper outputs",
"address_rules": [{ "minimum": 1, "maximum": 50 }],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Address map\n\n| Public addresses | Behavior |\n| --- | --- |\n| `1-28` | Standard drivers. |\n| `29-30` | J111 state outputs. |\n| `31` | The real pre-Fliptronic Game-On solenoid, controlled by `WPC_GILAMPS` bit `7` through the power-driver relay chain to the cabinet switch and flippers. |\n| `32` | Constant zero. |\n| `34`, `36`, `46`, `48` | Generic flipper callbacks: upper-right, upper-left, lower-right, and lower-left, respectively. |\n\nExplicit unused positions continue through the first custom-output boundary at `50`.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Eight-by-eight controlled-lamp matrix plus driver-declared auxiliary lamp columns",
"address_rules": [
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 }
],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "PinMAME applies wpc_sw2m/wpc_m2sw conversion to lamps. ChangedLamps therefore reports public matrix addresses 11-88 rather than sequential indices 1-64. A driver that declares hw.lampCol extra columns publishes them as columns 9 and 10, public addresses 91-98 and 101-108 (wpc_init sets the lamp count to 64 + lampCol * 8). On this generation only The Machine: Bride of Pinbot declares lampCol = 2, for its sixteen helmet chase lights driven through a shift register rather than the matrix; every other WPC-Alpha game publishes 11-88 only."
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "Five general-illumination strings",
"address_rules": [{ "minimum": 0, "maximum": 4 }],
"transports": {
"libpinmame": { "channel": "gi" },
"controller_plugin": { "group_id": 256, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
}
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/wpc.h; src/wpc/wpc.c; src/wpc/core.h; src/wpc/core.c; src/libpinmame/libpinmame.cpp"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"locator": "src/wpc/wpc.c wpc_init nLamps = 64 + lampCol * 8; src/wpc/sims/wpc/full/bop.c bopGameData lampCol = 2 and bop_wpc_w helmet shift register"
}
]
}
@@ -0,0 +1,105 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.wpc-dcs",
"authority": "pinmame",
"hardware_family": "Williams/Bally WPC-DCS",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Coin-door, switch-matrix, Fliptronic flipper, and optional custom switch column inputs",
"address_rules": [
{ "minimum": 1, "maximum": 8 },
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 },
{ "minimum": 111, "maximum": 118 },
{ "minimum": 121, "maximum": 168 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Cabinet inputs\n\nAddresses `1-8` are the four coin chutes and the four coin-door service buttons in printed row order (internal array column `0`, `CORE_COINDOORSWCOL`).\n\n#### Matrix inputs\n\nPublic matrix addresses use WPC column/row notation `11-88`, where the left digit is the drive column (internal array index `1-8`) and the right digit is the return row `1-8`; `wpc_m2sw(col,row) = col*10+row+1`. Column indices `9` and `10` (public `91-98`/`101-108`) are a gap in the base allocation that this generation leaves unused unless a specific driver's own `getSol`/switch-read hook independently claims part of it.\n\n#### Fliptronic inputs\n\nThis generation always has Fliptronic flipper inputs at internal column `11` (`CORE_FLIPPERSWCOL`), so `111-118` are the eight EOS/button positions in `WPC_swF1..WPC_swF8` order:\n\n| Address | Position |\n| --- | --- |\n| `111` | lower-right EOS |\n| `112` | lower-right button |\n| `113` | lower-left EOS |\n| `114` | lower-left button |\n| `115` | upper-right EOS |\n| `116` | upper-right button |\n| `117` | upper-left EOS |\n| `118` | upper-left button |\n\nThese positions are exactly as on WPC-95 and WPC-Fliptronic. A driver with no upper flippers is free to repurpose `115-118` for other switch-matrix-column-11 hardware entirely (for example, opto drop targets or a ramp-made sensor wired through the same physical column).\n\n#### Custom switch columns\n\nA driver may declare one or more additional custom switch columns through `core_tGameData hw.swCol`. PinMAME's fixed custom-column start is internal array index `CORE_CUSTSWCOL = CORE_STDSWCOLS = 12` (`src/wpc/core.h`), one column beyond the Fliptronic column. The same `col*10+row+1` formula, reported through the `CORE_CUSTSWNO(c,r)` macro, places the declared columns as follows:\n\n| Declared custom column | Public addresses |\n| --- | --- |\n| First | `121-128` |\n| Second | `131-138` |\n\nFurther columns continue the same pattern. A definition declares only the addresses its own machine's custom board actually wires. This numbering is a fixed `core.h` offset, not a driver-visible \"9th column\" printed silkscreen number: a printed board schematic that labels its own connector \"switch column 9\" documents the physical wiring harness, not the PinMAME public address. Any such printed number must be captured as a `manual.address` alias rather than assumed equal to the public switch number.\n\n#### Normalization\n\nUnlike WPC-95, this generation's `WPC_FLIPPERS` register read (`src/wpc/wpc.c`, `case WPC_FLIPPERS`, gated on `(gen & GENWPC_HASWPC95) == 0`) unconditionally returns the bitwise complement of the entire flipper switch matrix column regardless of hardware generation. The public Fliptronic state is already normalized here exactly as it is on WPC-95 via `WPC_FLIPPERSW95`; a recreation must not re-invert either range.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board option and country configuration bits",
"address_rules": [{ "minimum": 1, "maximum": 8 }],
"transports": { "libpinmame": { "channel": "dip" } }
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard, state, Fliptronic, and game-specific custom outputs",
"address_rules": [{ "minimum": 1, "maximum": 64 }],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Standard and state outputs\n\nThis generation exposes standard drivers `1-28` (`src/wpc/core.c` `core_getSol`, `solNo <= 28`). Addresses `29-30` mirror two WPC J111 general-purpose GPIO bits, and `31-32` use the same remap (`core_getSol` `solNo <= 32` branch, \"Remap WPC GameOn/J111 GPIO\", gated on `GEN_ALLWPC`, not WPC95-specific). Of those, `31` is PinMAME's synthetic fast-flip game-on state taken from the driver's RAM flag when `wpc_set_fastflip_addr` is set, and `32` is normally zero.\n\n| Public addresses | Behavior |\n| --- | --- |\n| `33-36` | Driver-specific outputs at `solenoids2` bits `4-7` (`core_getSol` `solNo <= 36` branch). On a driver that sets `FLIP_SOL(FLIP_UR)`/`FLIP_SOL(FLIP_UL)`, they are the Fliptronic upper-flipper power/hold pairs: `33`/`34` upper-right and `35`/`36` upper-left. A driver with no upper flippers is free to drive ordinary coils through the same four addresses instead, exactly like the switch-matrix column-11 repurposing. |\n| `45-48` | Fliptronic lower-flipper circuits: `45`/`46` lower-right power/hold and `47`/`48` lower-left power/hold, identically addressed to WPC-95. |\n| `49` | PinMAME's simulator-only ball-shooter channel. |\n| `50` | Reserved before the first custom-output boundary (`CORE_FIRSTCUSTSOL = 51`). |\n\n#### No LPDC range\n\nUnlike WPC-95/WPC-95DCS, this generation has no integrated LPDC board, so `37-44` are not a duplicated general-purpose output range. Pinned PinMAME's `core_getSol` dispatch (`src/wpc/core.c`, the \"37-44 WPC95 & S11 extra\" branch) only serves that range for `GEN_WPC95`/`GEN_WPC95DCS`/`GEN_ALLS11`, and returns constant `0` for this generation. Therefore `37-44` are simply unused address space here unless a specific driver's own `getSol` hook independently claims part of it.\n\n#### Custom outputs\n\nAbove that boundary, `51` upward are the game-specific custom solenoids a driver may publish through its own `core_tGameData.hw.getSol` handler, up to as many as its own `hw.custSol` count declares (`CORE_CUSTSOLNO(n) = CORE_FIRSTCUSTSOL - 1 + n`). A definition declares only the addresses its own machine publishes.\n\nA driver's own custom-solenoid board may carry silkscreened item numbers that do not match this public address space. Any such printed manual item number must be captured as a `manual.address` alias rather than assumed equal to the public solenoid number.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Eight-by-eight controlled-lamp matrix with optional auxiliary columns",
"address_rules": [
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 }
],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "PinMAME applies the shared wpc_sw2m/wpc_m2sw conversion to lamps (src/wpc/wpc.c MDRV_LAMP_CONV). ChangedLamps therefore reports public matrix addresses 11-88 rather than sequential indices, where the left digit is the drive column and the right digit is the return row. A driver may declare additional lamp columns through core_tGameData hw.lampCol; a definition declares only the columns its own machine populates."
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "Five general-illumination strings",
"address_rules": [{ "minimum": 0, "maximum": 4 }],
"transports": {
"libpinmame": { "channel": "gi" },
"controller_plugin": { "group_id": 256, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "Public GI addresses are zero-based 0-4 and correspond to the manuals' printed strings 01-05."
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/gen.h GEN_WPCDCS=U64(0x10) 'DCS Sound system, Indiana Jones 10/93 - Popeye 3/94'; src/wpc/wpc.c GENWPC_HASFLIPTRON=(GEN_ALLWPC & ~(GEN_WPCALPHA_1|GEN_WPCALPHA_2|GEN_WPCDMD)) which includes GEN_WPCDCS; GENWPC_HASWPC95=(GEN_WPC95|GEN_WPC95DCS); wpc_r case WPC_FLIPPERS unconditional complement of coreGlobals.swMatrix[CORE_FLIPPERSWCOL] for (gen & GENWPC_HASWPC95)==0; src/wpc/core.h CORE_COINDOORSWCOL=0, CORE_FLIPPERSWCOL=11, CORE_STDSWCOLS=12, CORE_CUSTSWCOL=CORE_STDSWCOLS, CORE_CUSTSWNO(c,r)=((CORE_CUSTSWCOL-1+c)*10+r), CORE_FIRSTUFLIPSOL=33, CORE_FIRSTLFLIPSOL=45, CORE_FIRSTCUSTSOL=51, CORE_CUSTSOLNO(n)=CORE_FIRSTCUSTSOL-1+n, CORE_STDLAMPCOLS=8, CORE_CUSTLAMPCOL=CORE_STDLAMPCOLS; src/wpc/core.c core_getSol full dispatch (29-32 GEN_ALLWPC J111/GameOn remap, 33-36 driver-specific solenoids2 bits4-7 unless FLIP_SOL(FLIP_UR)/FLIP_SOL(FLIP_UL) is set, 37-44 branch gated on GEN_WPC95/GEN_WPC95DCS/GEN_ALLS11 only, 45-48 lower flippers, 49-50 sim_getSol, 51+ hw.getSol); src/libpinmame/libpinmame.h PINMAME_HARDWARE_GEN_WPCDCS=0x10"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,103 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.wpc-fliptronic",
"authority": "pinmame",
"hardware_family": "Williams/Bally WPC Fliptronic",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Coin-door, switch-matrix, Fliptronic flipper, and optional custom switch column inputs",
"address_rules": [
{ "minimum": 1, "maximum": 8 },
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 111, "maximum": 118 },
{ "minimum": 121, "maximum": 168 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Cabinet inputs\n\nAddresses `1-8` are the four coin chutes and the four coin-door service buttons in printed row order.\n\n#### Matrix inputs\n\nPublic matrix addresses use WPC column/row notation `11-88`, where the left digit is the drive column and the right digit is the return row; values ending in `9` or `0` are not matrix positions.\n\n#### Fliptronic inputs\n\nThis generation always has Fliptronic flipper inputs, so `111-118` are the eight EOS/button positions in `WPC_swF1..WPC_swF8` order:\n\n| Address | Position |\n| --- | --- |\n| `111` | lower-right EOS |\n| `112` | lower-right button |\n| `113` | lower-left EOS |\n| `114` | lower-left button |\n| `115` | upper-right EOS |\n| `116` | upper-right button |\n| `117` | upper-left EOS |\n| `118` | upper-left button |\n\nThese positions are exactly as on WPC-95.\n\n#### Custom switch columns\n\nA driver may declare additional custom switch columns through `core_tGameData hw.swCol`, or define custom switches with the `CORE_CUSTSWNO(c,r)` macro and read them through its own switch-row handler. PinMAME's fixed custom-column start is internal array index `CORE_CUSTSWCOL = CORE_STDSWCOLS = 12` (`src/wpc/core.h`), one column beyond the Fliptronic column. The same `col*10+row+1` formula, reported through `CORE_CUSTSWNO(c,r) = (CORE_CUSTSWCOL-1+c)*10+r`, places the columns as follows:\n\n| Custom column | Public addresses |\n| --- | --- |\n| First | `121-128` |\n| Second | `131-138` |\n\nFurther columns continue the same pattern. A definition declares only the addresses its own machine's custom board actually wires. This numbering is a fixed `core.h` offset, not a printed \"9th column\": a manual that numbers such switches `91-98` documents the physical wiring harness, not the PinMAME public address, and a host write to `91-98` lands in internal column `9`. Any such printed number must be captured as a `manual.address` alias rather than assumed equal to the public switch number. The per-game inversion mask covers the first custom column through its `Cust` entry (internal column `12`).\n\n#### Normalization\n\nUnlike WPC-95, this generation's `WPC_FLIPPERS` register read (`core_r` offset `WPC_FLIPPERS`) unconditionally returns the bitwise complement of the flipper switch column regardless of hardware generation. The public Fliptronic state is already normalized here exactly as it is on WPC-95 via `WPC_FLIPPERSW95`; a recreation must not re-invert either range.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board option and country configuration bits",
"address_rules": [{ "minimum": 1, "maximum": 8 }],
"transports": { "libpinmame": { "channel": "dip" } }
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard, state, Fliptronic, and game-specific custom outputs",
"address_rules": [{ "minimum": 1, "maximum": 64 }],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Standard and state outputs\n\nThis generation exposes standard drivers `1-28`; `29-30` mirror two J111 general-purpose bits; `31` is PinMAME's synthetic game-on state, taken from the driver's fast-flip RAM flag when `wpc_set_fastflip_addr` is set; and `32` is always zero.\n\n| Public addresses | Behavior |\n| --- | --- |\n| `33-36` | Fliptronic upper-flipper circuits: `33`/`34` upper-right power/hold and `35`/`36` upper-left power/hold. Games may drive non-flipper devices through them. |\n| `45-48` | Fliptronic lower-flipper circuits: `45`/`46` lower-right power/hold and `47`/`48` lower-left power/hold, identically addressed to WPC-95. |\n| `49` | PinMAME's simulator-only ball-shooter channel. |\n| `50` | Reserved before the first custom-output boundary (`CORE_FIRSTCUSTSOL = 51`). |\n\n#### No LPDC range\n\nUnlike WPC-95, this generation has no integrated LPDC board, so `37-44` are not a duplicated general-purpose output range. Pinned PinMAME's `core_getSol` dispatch (`src/wpc/core.c`, the \"37-44 WPC95 & S11 extra\" branch) only serves that range for `GEN_WPC95`/`GEN_WPC95DCS`/`GEN_ALLS11`, and returns nothing for this generation. Therefore `37-44` are simply unused address space here unless a specific driver's own `getSol` hook independently claims part of it.\n\n#### Custom outputs\n\nAbove that boundary, `51` upward are the game-specific custom solenoids a driver may publish through its own `getSol` handler, up to as many as its `core_tGameData custSol` count declares. A definition declares only the addresses its own machine publishes.\n\nA driver's own custom-solenoid numbering (for example, an external auxiliary board's own silkscreened item numbers) is not the same as this public address space. Printed manual item numbers for such a board must be captured as a `manual.address` alias rather than assumed equal to the public solenoid number.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Eight-by-eight controlled-lamp matrix with optional auxiliary columns",
"address_rules": [
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 }
],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "PinMAME applies wpc_sw2m/wpc_m2sw conversion to lamps. ChangedLamps therefore reports public matrix addresses 11-88 rather than sequential indices 1-64, where the left digit is the drive column and the right digit is the return row. A driver may declare additional lamp columns through core_tGameData lampCol; a definition declares only the columns its own machine populates."
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "Five general-illumination strings",
"address_rules": [{ "minimum": 0, "maximum": 4 }],
"transports": {
"libpinmame": { "channel": "gi" },
"controller_plugin": { "group_id": 256, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "Public GI addresses are zero-based 0-4 and correspond to the manuals' printed strings 01-05."
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/wpc.h GENWPC_HASFLIPTRON/GENWPC_HASWPC95 masks; src/wpc/wpc.c WPC_FLIPPERS/WPC_FLIPPERSW95 register read (unconditional complement of coreGlobals.swMatrix[CORE_FLIPPERSWCOL] for non-WPC95 generations); src/wpc/core.h CORE_FIRSTUFLIPSOL=33/CORE_FIRSTLFLIPSOL=45/CORE_FLIPPERSWCOL=11/CORE_STDSWCOLS=12/CORE_CUSTSWCOL/CORE_FIRSTCUSTSOL=51/CORE_CUSTSOLNO/CORE_CUSTSWNO; src/wpc/core.c core_getSol dispatch showing the 37-44 branch is gated on GEN_WPC95/GEN_WPC95DCS/GEN_ALLS11 only; src/libpinmame/libpinmame.h PINMAME_HARDWARE_GEN_WPCFLIPTRON=0x8 (\"Fliptronic flippers, Addams Family 2/92 - Twilight Zone 5/93\")"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
@@ -0,0 +1,105 @@
{
"format": "pinmame-controller-profile",
"version": 1,
"id": "pinmame.wpc-security",
"authority": "pinmame",
"hardware_family": "Williams/Bally WPC Security",
"inversion_applied_by_emulator": true,
"groups": [
{
"id": "pinmame.input.switch",
"direction": "input",
"kind": "switch",
"label": "Coin-door, switch-matrix, Fliptronic flipper, and optional custom switch column inputs",
"address_rules": [
{ "minimum": 1, "maximum": 8 },
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 },
{ "minimum": 111, "maximum": 118 },
{ "minimum": 121, "maximum": 168 }
],
"transports": {
"libpinmame": { "channel": "switch" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Cabinet inputs\n\nAddresses `1-8` are the four coin chutes and the four coin-door service buttons in printed row order (internal array column `0`, `CORE_COINDOORSWCOL`).\n\n#### Matrix inputs\n\nPublic matrix addresses use WPC column/row notation `11-88`, where the left digit is the drive column (internal array index `1-8`) and the right digit is the return row `1-8`; `wpc_m2sw(col,row) = col*10+row+1`. Column indices `9` and `10` (public `91-98`/`101-108`) are a gap in the base allocation that this generation leaves unused unless a specific driver's own `getSol`/switch-read hook independently claims part of it.\n\n#### Fliptronic inputs\n\nThis generation always has Fliptronic flipper inputs at internal column `11` (`CORE_FLIPPERSWCOL`), so `111-118` are the eight EOS/button positions in `WPC_swF1..WPC_swF8` order:\n\n| Address | Position |\n| --- | --- |\n| `111` | lower-right EOS |\n| `112` | lower-right button |\n| `113` | lower-left EOS |\n| `114` | lower-left button |\n| `115` | upper-right EOS |\n| `116` | upper-right button |\n| `117` | upper-left EOS |\n| `118` | upper-left button |\n\nThese positions are exactly as on WPC-95 and WPC-DCS. A driver with no upper flippers is free to repurpose `115-118` for other switch-matrix-column-11 hardware entirely, or to leave the positions unwired.\n\n#### Custom switch columns\n\nA driver may declare one or more additional custom switch columns through `core_tGameData hw.swCol`. PinMAME's fixed custom-column start is internal array index `CORE_CUSTSWCOL = CORE_STDSWCOLS = 12` (`src/wpc/core.h`), one column beyond the Fliptronic column. The same `col*10+row+1` formula, reported through the `CORE_CUSTSWNO(c,r)` macro, places the declared columns as follows:\n\n| Declared custom column | Public addresses |\n| --- | --- |\n| First | `121-128` |\n| Second | `131-138` |\n\nFurther columns continue the same pattern. A definition declares only the addresses its own machine's custom board actually wires. This numbering is a fixed `core.h` offset, not a driver-visible printed silkscreen number. Any such printed board number must be captured as a `manual.address` alias rather than assumed equal to the public switch number.\n\n#### Normalization\n\nThis generation's `WPC_FLIPPERS` register read (`src/wpc/wpc.c`, `case WPC_FLIPPERS`, gated on `(gen & GENWPC_HASWPC95) == 0`, and `GENWPC_HASWPC95 = GEN_WPC95 | GEN_WPC95DCS` excludes `GEN_WPCSECURITY`) unconditionally returns the bitwise complement of the entire flipper switch matrix column exactly as on WPC-DCS and WPC-Fliptronic. The public Fliptronic state is already normalized here; a recreation must not re-invert it.\n\n#### Security-PIC row read\n\nSeparately, this generation's `WPC_SWROWREAD` register read (`src/wpc/wpc.c`, `case WPC_SWROWREAD`) is gated on `GENWPC_HASPIC = GEN_WPCSECURITY | GEN_WPC95 | GEN_WPC95DCS` and dispatches to the emulated security-PIC row reader (`wpc_pic_r`) instead of the plain `core_getSwCol` column reader that WPC-DCS/WPC-Fliptronic use. This changes how the emulator internally scans the matrix through the security handshake but does not change the public `col*10+row+1` address space or its normalization: `core_getSw`/`core_setSw`/`core_updInvSw` apply identically regardless of `GENWPC_HASPIC`.",
"notes_format": "markdown"
},
{
"id": "pinmame.input.dip",
"direction": "configuration",
"kind": "dip_switch",
"label": "CPU-board option and country configuration bits",
"address_rules": [{ "minimum": 1, "maximum": 8 }],
"transports": { "libpinmame": { "channel": "dip" } }
},
{
"id": "pinmame.output.solenoid",
"direction": "controlled_device",
"kind": "solenoid",
"label": "Standard, state, Fliptronic, and game-specific custom outputs",
"address_rules": [{ "minimum": 1, "maximum": 64 }],
"transports": {
"libpinmame": { "channel": "solenoid" },
"controller_plugin": { "group_id": 1, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "#### Standard and state outputs\n\nThis generation exposes standard drivers `1-28` (`src/wpc/core.c` `core_getSol`, `solNo <= 28`). Addresses `29-30` mirror two WPC J111 general-purpose GPIO bits, and `31-32` use the same remap (`core_getSol` `solNo <= 32` branch, \"Remap WPC GameOn/J111 GPIO\", gated on `GEN_ALLWPC`, not WPC95-specific). Of those, `31` is PinMAME's synthetic fast-flip game-on state taken from the driver's RAM flag when `wpc_set_fastflip_addr` is set, and `32` is normally zero.\n\n| Public addresses | Behavior |\n| --- | --- |\n| `33-36` | Driver-specific outputs at `solenoids2` bits `4-7` (`core_getSol` `solNo <= 36` branch). On a driver that sets `FLIP_SOL(FLIP_UR)`/`FLIP_SOL(FLIP_UL)`, they are the Fliptronic upper-flipper power/hold pairs: `33`/`34` upper-right and `35`/`36` upper-left. A driver with no upper flippers is free to drive ordinary coils through the same four addresses instead, with no address translation, exactly like WPC-DCS. |\n| `45-48` | Fliptronic lower-flipper circuits: `45`/`46` lower-right power/hold and `47`/`48` lower-left power/hold, identically addressed to WPC-95 and WPC-DCS. |\n| `49` | PinMAME's simulator-only ball-shooter channel. |\n| `50` | Reserved before the first custom-output boundary (`CORE_FIRSTCUSTSOL = 51`). |\n\n#### No LPDC range\n\nUnlike WPC-95/WPC-95DCS, this generation has no integrated LPDC board, so `37-44` are not a duplicated general-purpose output range. Pinned PinMAME's `core_getSol` dispatch (`src/wpc/core.c`, the \"37-44 WPC95 & S11 extra\" branch) only serves that range for `GEN_WPC95`/`GEN_WPC95DCS`/`GEN_ALLS11`, and returns constant `0` for this generation. Therefore `37-44` are simply unused address space here unless a specific driver's own `getSol` hook independently claims part of it.\n\n#### Custom outputs\n\nAbove that boundary, `51` upward are the game-specific custom solenoids a driver may publish through its own `core_tGameData.hw.getSol` handler, up to as many as its own `hw.custSol` count declares (`CORE_CUSTSOLNO(n) = CORE_FIRSTCUSTSOL - 1 + n`). A definition declares only the addresses its own machine publishes.\n\nA driver's own custom-solenoid board may carry silkscreened item numbers that do not match this public address space. Any such printed manual item number must be captured as a `manual.address` alias rather than assumed equal to the public solenoid number.",
"notes_format": "markdown"
},
{
"id": "pinmame.output.lamp",
"direction": "controlled_device",
"kind": "lamp",
"label": "Eight-by-eight controlled-lamp matrix with optional auxiliary columns",
"address_rules": [
{ "minimum": 11, "maximum": 18 },
{ "minimum": 21, "maximum": 28 },
{ "minimum": 31, "maximum": 38 },
{ "minimum": 41, "maximum": 48 },
{ "minimum": 51, "maximum": 58 },
{ "minimum": 61, "maximum": 68 },
{ "minimum": 71, "maximum": 78 },
{ "minimum": 81, "maximum": 88 },
{ "minimum": 91, "maximum": 98 },
{ "minimum": 101, "maximum": 108 }
],
"transports": {
"libpinmame": { "channel": "lamp" },
"controller_plugin": { "group_id": 512, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "PinMAME applies the shared wpc_sw2m/wpc_m2sw conversion to lamps (src/wpc/wpc.c MDRV_LAMP_CONV). ChangedLamps therefore reports public matrix addresses 11-88 rather than sequential indices, where the left digit is the drive column and the right digit is the return row. A driver may declare additional lamp columns through core_tGameData hw.lampCol; a definition declares only the columns its own machine populates."
},
{
"id": "pinmame.output.gi",
"direction": "controlled_device",
"kind": "gi",
"label": "Five general-illumination strings",
"address_rules": [{ "minimum": 0, "maximum": 4 }],
"transports": {
"libpinmame": { "channel": "gi" },
"controller_plugin": { "group_id": 256, "contract_revision": "a6f6d7266d301249ed09c1b0123f8476513a2228" }
},
"notes": "Public GI addresses are zero-based 0-4 and correspond to the manuals' printed strings 01-05."
}
],
"sources": [
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "4ec52ff0ac133ac251681518aed2249e19fe26eb",
"locator": "src/wpc/gen.h GEN_WPCSECURITY=U64(0x20) 'Security chip, World Cup Soccer 3/94 - Jackbot 10/95'; src/wpc/wpc.c GENWPC_HASFLIPTRON=(GEN_ALLWPC & ~(GEN_WPCALPHA_1|GEN_WPCALPHA_2|GEN_WPCDMD)) which includes GEN_WPCSECURITY; GENWPC_HASWPC95=(GEN_WPC95|GEN_WPC95DCS) which excludes GEN_WPCSECURITY; GENWPC_HASPIC=(GEN_WPCSECURITY|GEN_WPC95|GEN_WPC95DCS); wpc_r case WPC_FLIPPERS unconditional complement of coreGlobals.swMatrix[CORE_FLIPPERSWCOL] for (gen & GENWPC_HASWPC95)==0; wpc_r case WPC_SWROWREAD dispatches to wpc_pic_r() when GENWPC_HASPIC; wpc_w case WPC_SWCOLSELECT dispatches to wpc_pic_w() when GENWPC_HASPIC; src/wpc/core.h CORE_COINDOORSWCOL=0, CORE_FLIPPERSWCOL=11, CORE_STDSWCOLS=12, CORE_CUSTSWCOL=CORE_STDSWCOLS, CORE_CUSTSWNO(c,r)=((CORE_CUSTSWCOL-1+c)*10+r), CORE_FIRSTUFLIPSOL=33, CORE_FIRSTLFLIPSOL=45, CORE_FIRSTCUSTSOL=51, CORE_CUSTSOLNO(n)=CORE_FIRSTCUSTSOL-1+n, CORE_STDLAMPCOLS=8, CORE_CUSTLAMPCOL=CORE_STDLAMPCOLS; src/wpc/core.c core_getSol full dispatch (29-32 GEN_ALLWPC J111/GameOn remap, 33-36 driver-specific solenoids2 bits4-7 unless FLIP_SOL(FLIP_UR)/FLIP_SOL(FLIP_UL) is set, 37-44 branch gated on GEN_WPC95/GEN_WPC95DCS/GEN_ALLS11 only, 45-48 lower flippers, 49-50 sim_getSol, 51+ hw.getSol); src/wpc/core.c core_getSw/core_setSw/core_updInvSw (swNo=(swNo/10)*8+(swNo%10-1); invSw[swNo/8] applies regardless of GENWPC_HASPIC); src/libpinmame/libpinmame.h PINMAME_HARDWARE_GEN_WPCSECURITY=0x20"
},
{
"uri": "https://github.com/vpinball/pinmame",
"revision": "a6f6d7266d301249ed09c1b0123f8476513a2228",
"locator": "src/libpinmame/libpinmame.cpp SetupMsgApi group definitions"
}
]
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Disco '79",
"flags": 0,
"id": "disco79",
"manufacturer": "Allied Leisure",
"year": "1979"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/disco-79-1979.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.disco-79.1979",
"ipdb_id": 3823,
"manufacturer": "Allied Leisure",
"name": "Disco '79",
"opdb_id": "Gr83Y-MDlW2",
"year": 1979
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Flame of Athens",
"flags": 0,
"id": "foathens",
"manufacturer": "Allied Leisure",
"year": "1978"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/flame-of-athens-1978.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.flame-of-athens.1978",
"ipdb_id": 3100,
"manufacturer": "Allied Leisure",
"name": "Flame of Athens",
"opdb_id": "G5LOx-MDlR2",
"year": 1978
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Hearts Spades",
"flags": 0,
"id": "heartspd",
"manufacturer": "Allied Leisure",
"year": "1978"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/hearts-spades-1978.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.hearts-spades.1978",
"ipdb_id": 1146,
"manufacturer": "Allied Leisure",
"name": "Hearts Spades",
"opdb_id": "G5pkl-MJPrP",
"year": 1978
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Hoe Down",
"flags": 0,
"id": "hoedown",
"manufacturer": "Allied Leisure",
"year": "1978"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/hoe-down-1978.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.hoe-down.1978",
"ipdb_id": 1252,
"manufacturer": "Allied Leisure",
"name": "Hoe Down",
"opdb_id": "G4J11-MJ9B1",
"year": 1978
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Roy Clark Super Picker",
"flags": 0,
"id": "suprpick",
"manufacturer": "Allied Leisure",
"year": "1977"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/roy-clark-super-picker-1977.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.roy-clark-super-picker.1977",
"ipdb_id": 2438,
"manufacturer": "Allied Leisure",
"name": "Roy Clark Super Picker",
"opdb_id": "G4J11-MDXwO",
"year": 1977
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Star Shooter",
"flags": 0,
"id": "starshot",
"manufacturer": "Allied Leisure",
"year": "1979"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/star-shooter-1979.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.star-shooter.1979",
"ipdb_id": 3500,
"manufacturer": "Allied Leisure",
"name": "Star Shooter",
"opdb_id": "G4d9E-MLRqz",
"year": 1979
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,355 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Take Five",
"flags": 0,
"id": "takefive",
"manufacturer": "Allied Leisure",
"year": "1978"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "1"
}
],
"binding": {
"device": 1,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "2"
}
],
"binding": {
"device": 2,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "3"
}
],
"binding": {
"device": 3,
"group": "pinmame.input.switch"
},
"id": "switch.bumper3",
"kind": "switch",
"label": "Bumper3",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "6"
}
],
"binding": {
"device": 6,
"group": "pinmame.input.switch"
},
"id": "switch.sling4",
"kind": "switch",
"label": "Sling4",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "7"
}
],
"binding": {
"device": 7,
"group": "pinmame.input.switch"
},
"id": "switch.right-slingshot",
"kind": "switch",
"label": "Right Slingshot",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "15"
}
],
"binding": {
"device": 15,
"group": "pinmame.input.switch"
},
"id": "switch.left-slingshot",
"kind": "switch",
"label": "Left Slingshot",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.input.switch"
},
"id": "switch.trigger5",
"kind": "switch",
"label": "Trigger5",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.trigger8",
"kind": "switch",
"label": "Trigger8",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.trigger9",
"kind": "switch",
"label": "Trigger9",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.trigger4",
"kind": "switch",
"label": "Trigger4",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.trigger1",
"kind": "switch",
"label": "Trigger1",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.trigger3",
"kind": "switch",
"label": "Trigger3",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.trigger2",
"kind": "switch",
"label": "Trigger2",
"provenance": {
"source_refs": [
"vpx-script.4a917c5cdde3e39c"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/allied-leisure/take-five-1978.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.take-five.1978",
"ipdb_id": 2492,
"manufacturer": "Allied Leisure",
"name": "Take Five",
"opdb_id": "G4XD3-MQk3l",
"year": 1978
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Take Five (Allied Leisure 1978).vbs and repository contributors",
"id": "vpx-script.4a917c5cdde3e39c",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Take Five (Allied Leisure 1978).vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "4a917c5cdde3e39c551996184435d5ea24979456973d8c443494546b854c6493",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,71 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "allied",
"description": "Thunderbolt",
"flags": 0,
"id": "thndbolt",
"manufacturer": "Allied Leisure",
"year": "1977"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/allied-leisure/thunderbolt-1976.md",
"status": "partial"
},
"machine": {
"id": "allied-leisure.thunderbolt.1976",
"ipdb_id": 2556,
"manufacturer": "Allied Leisure",
"name": "Thunderbolt",
"opdb_id": "GRVzX-MJdy0",
"year": 1976
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,110 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "agsoccer",
"description": "A.G. Football (R07u)",
"flags": 0,
"id": "agfoot07",
"manufacturer": "Alvin G",
"year": "1992"
},
{
"clone_of": "agsoccer",
"description": "A.G. Football (R18u, 2.1 Sound)",
"flags": 0,
"id": "agfootbl",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"clone_of": "agsoccer",
"description": "A.G. Football (R18u, 2.5L Sound)",
"flags": 0,
"id": "agfootbl25l",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"clone_of": "agsoccer",
"description": "A.G. Soccer-Ball (R07u)",
"flags": 0,
"id": "agsocc07",
"manufacturer": "Alvin G",
"year": "1992"
},
{
"description": "A.G. Soccer-Ball (R18u, 2.1 Sound)",
"flags": 0,
"id": "agsoccer",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"clone_of": "agsoccer",
"description": "A.G. Soccer-Ball (R18u, 2.5L Sound)",
"flags": 0,
"id": "agsoccer25l",
"manufacturer": "Alvin G",
"year": "1993"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/alvin-g/a-g-soccer-ball-1991.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.a-g-soccer-ball.1991",
"ipdb_id": 120,
"manufacturer": "Alvin G",
"name": "A.G. Soccer-Ball",
"opdb_id": "G5wxv-MQP9z",
"year": 1991
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,946 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "wrldtour",
"description": "Al's Garage Band Goes On a World Tour (R02b Version B)",
"flags": 0,
"id": "wrldtou2",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"clone_of": "wrldtour",
"description": "Al's Garage Band Goes On a World Tour (R06a Prototype/Version A)",
"flags": 0,
"id": "wrldtou3",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"clone_of": "wrldtour",
"description": "Al's Garage Band Goes On a World Tour (R09a Prototype/Version A)",
"flags": 0,
"id": "wrldtou4",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"description": "Al's Garage Band Goes On a World Tour (R01c Version B)",
"flags": 0,
"id": "wrldtour",
"manufacturer": "Alvin G",
"year": "1993"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "14"
}
],
"binding": {
"device": 14,
"group": "pinmame.input.switch"
},
"id": "switch.sw14",
"kind": "switch",
"label": "Sw14",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.input.switch"
},
"id": "switch.bumper3",
"kind": "switch",
"label": "Bumper3",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "20"
}
],
"binding": {
"device": 20,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot1",
"kind": "switch",
"label": "Left Sling Shot1",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.sw23",
"kind": "switch",
"label": "Sw23",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.sw25",
"kind": "switch",
"label": "Sw25",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.sw26",
"kind": "switch",
"label": "Sw26",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.input.switch"
},
"id": "switch.sw27",
"kind": "switch",
"label": "Sw27",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.sw28",
"kind": "switch",
"label": "Sw28",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.sw29",
"kind": "switch",
"label": "Sw29",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "30"
}
],
"binding": {
"device": 30,
"group": "pinmame.input.switch"
},
"id": "switch.sw30",
"kind": "switch",
"label": "Sw30",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.input.switch"
},
"id": "switch.sw31",
"kind": "switch",
"label": "Sw31",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.sw32",
"kind": "switch",
"label": "Sw32",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "33"
}
],
"binding": {
"device": 33,
"group": "pinmame.input.switch"
},
"id": "switch.sw33",
"kind": "switch",
"label": "Sw33",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.sw34",
"kind": "switch",
"label": "Sw34",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "35"
}
],
"binding": {
"device": 35,
"group": "pinmame.input.switch"
},
"id": "switch.sw35",
"kind": "switch",
"label": "Sw35",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.sw36",
"kind": "switch",
"label": "Sw36",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "38"
}
],
"binding": {
"device": 38,
"group": "pinmame.input.switch"
},
"id": "switch.top-vuk",
"kind": "switch",
"label": "Top VUK",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "39"
}
],
"binding": {
"device": 39,
"group": "pinmame.input.switch"
},
"id": "switch.sw39",
"kind": "switch",
"label": "Sw39",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "41"
}
],
"binding": {
"device": 41,
"group": "pinmame.input.switch"
},
"id": "switch.sw41",
"kind": "switch",
"label": "Sw41",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "42"
}
],
"binding": {
"device": 42,
"group": "pinmame.input.switch"
},
"id": "switch.sw42",
"kind": "switch",
"label": "Sw42",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "43"
}
],
"binding": {
"device": 43,
"group": "pinmame.input.switch"
},
"id": "switch.sw43",
"kind": "switch",
"label": "Sw43",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "44"
}
],
"binding": {
"device": 44,
"group": "pinmame.input.switch"
},
"id": "switch.sw44",
"kind": "switch",
"label": "Sw44",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "45"
}
],
"binding": {
"device": 45,
"group": "pinmame.input.switch"
},
"id": "switch.sw45",
"kind": "switch",
"label": "Sw45",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "46"
}
],
"binding": {
"device": 46,
"group": "pinmame.input.switch"
},
"id": "switch.sw46",
"kind": "switch",
"label": "Sw46",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "47"
}
],
"binding": {
"device": 47,
"group": "pinmame.input.switch"
},
"id": "switch.sw47",
"kind": "switch",
"label": "Sw47",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "48"
}
],
"binding": {
"device": 48,
"group": "pinmame.input.switch"
},
"id": "switch.sw48",
"kind": "switch",
"label": "Sw48",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "49"
}
],
"binding": {
"device": 49,
"group": "pinmame.input.switch"
},
"id": "switch.sw49",
"kind": "switch",
"label": "Sw49",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "50"
}
],
"binding": {
"device": 50,
"group": "pinmame.input.switch"
},
"id": "switch.sw50",
"kind": "switch",
"label": "Sw50",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "51"
}
],
"binding": {
"device": 51,
"group": "pinmame.input.switch"
},
"id": "switch.sw51",
"kind": "switch",
"label": "Sw51",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "52"
}
],
"binding": {
"device": 52,
"group": "pinmame.input.switch"
},
"id": "switch.sw52",
"kind": "switch",
"label": "Sw52",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/alvin-g/al-s-garage-band-goes-on-a-world-tour-1992.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.al-s-garage-band-goes-on-a-world-tour.1992",
"ipdb_id": 3513,
"manufacturer": "Alvin G",
"name": "Al's Garage Band goes on a World Tour",
"opdb_id": "GRLz0-MeP4B",
"year": 1992
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "1"
}
],
"binding": {
"device": 1,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-kickback",
"kind": "coil",
"label": "Sol Kickback",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "9"
}
],
"binding": {
"device": 9,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-autofire",
"kind": "coil",
"label": "Sol Autofire",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.output.solenoid"
},
"id": "coil.pfgi",
"kind": "coil",
"label": "PFGI",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-disk",
"kind": "coil",
"label": "Sol Disk",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.output.solenoid"
},
"id": "coil.solback",
"kind": "coil",
"label": "Solback",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.output.solenoid"
},
"id": "coil.vuk-top-pop",
"kind": "coil",
"label": "Vuk Top Pop",
"provenance": {
"source_refs": [
"vpx-script.8305f507d02e09c8"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Al's Garage Band Goes On A World Tour (AlvinG 1992) anti(Mod) V2.vbs and repository contributors",
"id": "vpx-script.8305f507d02e09c8",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Al's Garage Band Goes On A World Tour (AlvinG 1992) anti(Mod) V2.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "8305f507d02e09c8de3003e454a0dbeb26a8506f82c6e2b0d3af0f8eb983de43",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,69 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"identity",
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Dinosaur Eggs (R02)",
"flags": 0,
"id": "dinoeggs",
"manufacturer": "Alvin G",
"year": "1993"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/alvin-g/dinosaur-eggs-r02-1993.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.dinosaur-eggs-r02.1993",
"manufacturer": "Alvin G",
"name": "Dinosaur Eggs (R02)",
"year": 1993
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,951 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "mystcast",
"description": "Mystery Castle (R03)",
"flags": 0,
"id": "mystcasa",
"manufacturer": "Alvin G",
"year": "199?"
},
{
"description": "Mystery Castle (R02)",
"flags": 0,
"id": "mystcast",
"manufacturer": "Alvin G",
"year": "1993"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.sw17",
"kind": "switch",
"label": "Sw17",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.sol-ball-release",
"kind": "switch",
"label": "Sol Ball Release",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.sw21",
"kind": "switch",
"label": "Sw21",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.sw23",
"kind": "switch",
"label": "Sw23",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.sw24",
"kind": "switch",
"label": "Sw24",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.input.switch"
},
"id": "switch.left-slingshot",
"kind": "switch",
"label": "Left Slingshot",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.sw29",
"kind": "switch",
"label": "Sw29",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "30"
}
],
"binding": {
"device": 30,
"group": "pinmame.input.switch"
},
"id": "switch.sw30",
"kind": "switch",
"label": "Sw30",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.input.switch"
},
"id": "switch.sw31",
"kind": "switch",
"label": "Sw31",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.sw32",
"kind": "switch",
"label": "Sw32",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "39"
}
],
"binding": {
"device": 39,
"group": "pinmame.input.switch"
},
"id": "switch.sw39",
"kind": "switch",
"label": "Sw39",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "45"
}
],
"binding": {
"device": 45,
"group": "pinmame.input.switch"
},
"id": "switch.sw45",
"kind": "switch",
"label": "Sw45",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "46"
}
],
"binding": {
"device": 46,
"group": "pinmame.input.switch"
},
"id": "switch.sw46",
"kind": "switch",
"label": "Sw46",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "47"
}
],
"binding": {
"device": 47,
"group": "pinmame.input.switch"
},
"id": "switch.sw47",
"kind": "switch",
"label": "Sw47",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "48"
}
],
"binding": {
"device": 48,
"group": "pinmame.input.switch"
},
"id": "switch.sw48",
"kind": "switch",
"label": "Sw48",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "53"
}
],
"binding": {
"device": 53,
"group": "pinmame.input.switch"
},
"id": "switch.sw53",
"kind": "switch",
"label": "Sw53",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "54"
}
],
"binding": {
"device": 54,
"group": "pinmame.input.switch"
},
"id": "switch.sw54",
"kind": "switch",
"label": "Sw54",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "55"
}
],
"binding": {
"device": 55,
"group": "pinmame.input.switch"
},
"id": "switch.sw55",
"kind": "switch",
"label": "Sw55",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/alvin-g/mystery-castle-1993.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.mystery-castle.1993",
"ipdb_id": 1647,
"manufacturer": "Alvin G",
"name": "Mystery Castle",
"opdb_id": "G5vZZ-MQNNo",
"year": 1993
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "6"
}
],
"binding": {
"device": 6,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-kicker-mega-mode",
"kind": "coil",
"label": "Sol Kicker Mega Mode",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "11"
}
],
"binding": {
"device": 11,
"group": "pinmame.output.solenoid"
},
"id": "coil.reset-drops-u",
"kind": "coil",
"label": "Reset Drops U",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "12"
}
],
"binding": {
"device": 12,
"group": "pinmame.output.solenoid"
},
"id": "coil.reset-drops-d",
"kind": "coil",
"label": "Reset Drops D",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-outhole",
"kind": "coil",
"label": "Sol Outhole",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "14"
}
],
"binding": {
"device": 14,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-knocker",
"kind": "coil",
"label": "Sol Knocker",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-f16",
"kind": "coil",
"label": "Sol F16",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-flash17",
"kind": "coil",
"label": "Sol Flash17",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.output.solenoid"
},
"id": "coil.flash18",
"kind": "coil",
"label": "Flash18",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.output.solenoid"
},
"id": "coil.flash19",
"kind": "coil",
"label": "Flash19",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "20"
}
],
"binding": {
"device": 20,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-flash20",
"kind": "coil",
"label": "Sol Flash20",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-flash21",
"kind": "coil",
"label": "Sol Flash21",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.output.solenoid"
},
"id": "coil.flash22",
"kind": "coil",
"label": "Flash22",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.output.solenoid"
},
"id": "coil.flash23",
"kind": "coil",
"label": "Flash23",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.output.solenoid"
},
"id": "coil.flash24",
"kind": "coil",
"label": "Flash24",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-f26",
"kind": "coil",
"label": "Sol F26",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-game-on",
"kind": "coil",
"label": "Sol Game On",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.output.solenoid"
},
"id": "coil.back-relay-norm29",
"kind": "coil",
"label": "Back Relay Norm29",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "30"
}
],
"binding": {
"device": 30,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-ball-release",
"kind": "coil",
"label": "Sol Ball Release",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.output.solenoid"
},
"id": "coil.back-relay-doom31",
"kind": "coil",
"label": "Back Relay Doom31",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-diverterx",
"kind": "coil",
"label": "Sol Diverterx",
"provenance": {
"source_refs": [
"vpx-script.1feb341341cba7be"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Mystery Castle (Alvin G 1993) v.2.3.1.vbs and repository contributors",
"id": "vpx-script.1feb341341cba7be",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Mystery Castle (Alvin G 1993) v.2.3.1.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "1feb341341cba7bebba8f27ff8e3ae21f643ebd27eb293be2bf825215cd3f90d",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,594 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Punchy The Clown (R02)",
"flags": 0,
"id": "punchy",
"manufacturer": "Alvin G",
"year": "1993"
},
{
"clone_of": "punchy",
"description": "Punchy The Clown (R03)",
"flags": 0,
"id": "punchy3",
"manufacturer": "Alvin G",
"year": "1993"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.sw18",
"kind": "switch",
"label": "Sw18",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.input.switch"
},
"id": "switch.sw19",
"kind": "switch",
"label": "Sw19",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "20"
}
],
"binding": {
"device": 20,
"group": "pinmame.input.switch"
},
"id": "switch.sw20",
"kind": "switch",
"label": "Sw20",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.sw21",
"kind": "switch",
"label": "Sw21",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.sw22",
"kind": "switch",
"label": "Sw22",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.sw23",
"kind": "switch",
"label": "Sw23",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.sw24",
"kind": "switch",
"label": "Sw24",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.bumper3",
"kind": "switch",
"label": "Bumper3",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "30"
}
],
"binding": {
"device": 30,
"group": "pinmame.input.switch"
},
"id": "switch.sw30",
"kind": "switch",
"label": "Sw30",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.input.switch"
},
"id": "switch.sw31",
"kind": "switch",
"label": "Sw31",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.rlband007",
"kind": "switch",
"label": "Rlband007",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "40"
}
],
"binding": {
"device": 40,
"group": "pinmame.input.switch"
},
"id": "switch.spinner",
"kind": "switch",
"label": "Spinner",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "41"
}
],
"binding": {
"device": 41,
"group": "pinmame.input.switch"
},
"id": "switch.sw41",
"kind": "switch",
"label": "Sw41",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "42"
}
],
"binding": {
"device": 42,
"group": "pinmame.input.switch"
},
"id": "switch.sw42",
"kind": "switch",
"label": "Sw42",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "43"
}
],
"binding": {
"device": 43,
"group": "pinmame.input.switch"
},
"id": "switch.sw43",
"kind": "switch",
"label": "Sw43",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "46"
}
],
"binding": {
"device": 46,
"group": "pinmame.input.switch"
},
"id": "switch.sw46",
"kind": "switch",
"label": "Sw46",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "47"
}
],
"binding": {
"device": 47,
"group": "pinmame.input.switch"
},
"id": "switch.sw47",
"kind": "switch",
"label": "Sw47",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "48"
}
],
"binding": {
"device": 48,
"group": "pinmame.input.switch"
},
"id": "switch.sw48",
"kind": "switch",
"label": "Sw48",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/alvin-g/punchy-the-clown-1993.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.punchy-the-clown.1993",
"ipdb_id": 3508,
"manufacturer": "Alvin G",
"name": "Punchy the Clown",
"opdb_id": "G4x2P-MnK03",
"year": 1993
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-gi",
"kind": "coil",
"label": "Sol Gi",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-ticket",
"kind": "coil",
"label": "Sol Ticket",
"provenance": {
"source_refs": [
"vpx-script.15c7be735b9dcccf"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Punchy the Clown (Alvin G and Co 1993) v600.vbs and repository contributors",
"id": "vpx-script.15c7be735b9dcccf",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Punchy the Clown (Alvin G and Co 1993) v600.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "15c7be735b9dcccf5e02679cefcbf088845877bb371bc1d49082228d5b2e99d4",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,78 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "usafootb",
"description": "U.S.A. Football (R01u)",
"flags": 0,
"id": "usafoota",
"manufacturer": "Alvin G",
"year": "1992"
},
{
"description": "U.S.A. Football (R06u)",
"flags": 0,
"id": "usafootb",
"manufacturer": "Alvin G",
"year": "1993"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/alvin-g/u-s-a-football-1992.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.u-s-a-football.1992",
"ipdb_id": 2710,
"manufacturer": "Alvin G",
"name": "U.S.A. Football",
"opdb_id": "G5wxv-MP3k9",
"year": 1992
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,70 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"identity",
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "U.S.A. Football (Redemption, P08)",
"flags": 0,
"id": "usafootr",
"manufacturer": "Alvin G",
"year": "1994"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/alvin-g/u-s-a-football-redemption-p08-1994.md",
"status": "partial"
},
"machine": {
"id": "alvin-g.u-s-a-football-redemption-p08.1994",
"kind": "redemption_game",
"manufacturer": "Alvin G",
"name": "U.S.A. Football (Redemption, P08)",
"year": 1994
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,70 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Thunder Man",
"flags": 0,
"id": "thndrman",
"manufacturer": "Apple Time",
"year": "1987"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/apple-time/thunder-man-1987.md",
"status": "partial"
},
"machine": {
"id": "apple-time.thunder-man.1987",
"ipdb_id": 4666,
"manufacturer": "Apple Time",
"name": "Thunder Man",
"opdb_id": "GRoyw-M4ojr",
"year": 1987
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,69 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"identity",
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Rush (1.0)",
"flags": 512,
"id": "rush_10",
"manufacturer": "Astill Entertainment",
"year": "20??"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/astill-entertainment/rush-1-0-unknown.md",
"status": "partial"
},
"machine": {
"id": "astill-entertainment.rush-1-0",
"manufacturer": "Astill Entertainment",
"name": "Rush (1.0)",
"year": null
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,544 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Black Sheep Squadron",
"flags": 0,
"id": "blkshpsq",
"manufacturer": "Astro",
"year": "1978"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "1"
}
],
"binding": {
"device": 1,
"group": "pinmame.input.switch"
},
"id": "switch.sw1",
"kind": "switch",
"label": "Sw1",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "2"
}
],
"binding": {
"device": 2,
"group": "pinmame.input.switch"
},
"id": "switch.pinner1",
"kind": "switch",
"label": "Pinner1",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "12"
}
],
"binding": {
"device": 12,
"group": "pinmame.input.switch"
},
"id": "switch.sol-saucer",
"kind": "switch",
"label": "Sol Saucer",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.sw17a",
"kind": "switch",
"label": "Sw17a",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.sw21",
"kind": "switch",
"label": "Sw21",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.sw22",
"kind": "switch",
"label": "Sw22",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.sw23",
"kind": "switch",
"label": "Sw23",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.sw24",
"kind": "switch",
"label": "Sw24",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.sw25",
"kind": "switch",
"label": "Sw25",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.sw26",
"kind": "switch",
"label": "Sw26",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.sw29",
"kind": "switch",
"label": "Sw29",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "30"
}
],
"binding": {
"device": 30,
"group": "pinmame.input.switch"
},
"id": "switch.sw30",
"kind": "switch",
"label": "Sw30",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.input.switch"
},
"id": "switch.sw31",
"kind": "switch",
"label": "Sw31",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.sw32",
"kind": "switch",
"label": "Sw32",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "33"
}
],
"binding": {
"device": 33,
"group": "pinmame.input.switch"
},
"id": "switch.sw33",
"kind": "switch",
"label": "Sw33",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.sw34",
"kind": "switch",
"label": "Sw34",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "37"
}
],
"binding": {
"device": 37,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "38"
}
],
"binding": {
"device": 38,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "39"
}
],
"binding": {
"device": 39,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "40"
}
],
"binding": {
"device": 40,
"group": "pinmame.input.switch"
},
"id": "switch.bumper3",
"kind": "switch",
"label": "Bumper3",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/astro/black-sheep-squadron-1979.md",
"status": "partial"
},
"machine": {
"id": "astro.black-sheep-squadron.1979",
"ipdb_id": 314,
"manufacturer": "Astro",
"name": "Black Sheep Squadron",
"opdb_id": "G4j1L-MZerb",
"year": 1979
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "10"
}
],
"binding": {
"device": 10,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-saucer",
"kind": "coil",
"label": "Sol Saucer",
"provenance": {
"source_refs": [
"vpx-script.dc0ed0d3332c62b7"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Black Sheep Squadron (Astro 1979)1.4.vbs and repository contributors",
"id": "vpx-script.dc0ed0d3332c62b7",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Black Sheep Squadron (Astro 1979)1.4.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "dc0ed0d3332c62b7af077d66c02c7793ac97f446e6f9a8d68a4ea17d56d59605",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,70 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "4x4 (Prototype)",
"flags": 8,
"id": "fourx4",
"manufacturer": "Atari",
"year": "1982"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/atari/4x4-1983.md",
"status": "partial"
},
"machine": {
"id": "atari.4x4.1983",
"ipdb_id": 3111,
"manufacturer": "Atari",
"name": "4X4",
"opdb_id": "G59VQ-MLBVl",
"year": 1983
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,825 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "aavenger",
"description": "Airborne Avenger (Free Play)",
"flags": 0,
"id": "aavengef",
"manufacturer": "Atari",
"year": "2024"
},
{
"description": "Airborne Avenger",
"flags": 0,
"id": "aavenger",
"manufacturer": "Atari",
"year": "1977"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.midtarget",
"kind": "switch",
"label": "Midtarget",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.target3",
"kind": "switch",
"label": "Target3",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.target2",
"kind": "switch",
"label": "Target2",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.target1",
"kind": "switch",
"label": "Target1",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.out3",
"kind": "switch",
"label": "Out3",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "35"
}
],
"binding": {
"device": 35,
"group": "pinmame.input.switch"
},
"id": "switch.out2",
"kind": "switch",
"label": "Out2",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.out1",
"kind": "switch",
"label": "Out1",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "37"
}
],
"binding": {
"device": 37,
"group": "pinmame.input.switch"
},
"id": "switch.in2",
"kind": "switch",
"label": "In2",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "38"
}
],
"binding": {
"device": 38,
"group": "pinmame.input.switch"
},
"id": "switch.in1",
"kind": "switch",
"label": "In1",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "39"
}
],
"binding": {
"device": 39,
"group": "pinmame.input.switch"
},
"id": "switch.out4",
"kind": "switch",
"label": "Out4",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "40"
}
],
"binding": {
"device": 40,
"group": "pinmame.input.switch"
},
"id": "switch.out5",
"kind": "switch",
"label": "Out5",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "42"
}
],
"binding": {
"device": 42,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "43"
}
],
"binding": {
"device": 43,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "44"
}
],
"binding": {
"device": 44,
"group": "pinmame.input.switch"
},
"id": "switch.bumper3",
"kind": "switch",
"label": "Bumper3",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "45"
}
],
"binding": {
"device": 45,
"group": "pinmame.input.switch"
},
"id": "switch.spinner",
"kind": "switch",
"label": "Spinner",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "49"
}
],
"binding": {
"device": 49,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "50"
}
],
"binding": {
"device": 50,
"group": "pinmame.input.switch"
},
"id": "switch.lmsling",
"kind": "switch",
"label": "Lmsling",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "51"
}
],
"binding": {
"device": 51,
"group": "pinmame.input.switch"
},
"id": "switch.tlsling",
"kind": "switch",
"label": "TLsling",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "56"
}
],
"binding": {
"device": 56,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "57"
}
],
"binding": {
"device": 57,
"group": "pinmame.input.switch"
},
"id": "switch.bottomsling",
"kind": "switch",
"label": "Bottomsling",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "58"
}
],
"binding": {
"device": 58,
"group": "pinmame.input.switch"
},
"id": "switch.midswitch",
"kind": "switch",
"label": "Midswitch",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "59"
}
],
"binding": {
"device": 59,
"group": "pinmame.input.switch"
},
"id": "switch.midswitch-b",
"kind": "switch",
"label": "Midswitch B",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "60"
}
],
"binding": {
"device": 60,
"group": "pinmame.input.switch"
},
"id": "switch.t3000unhit1",
"kind": "switch",
"label": "T3000unhit1",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/atari/airborne-avenger-1977.md",
"status": "partial"
},
"machine": {
"id": "atari.airborne-avenger.1977",
"ipdb_id": 33,
"manufacturer": "Atari",
"name": "Airborne Avenger",
"opdb_id": "G4dZZ-MKNzE",
"year": 1977
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "2"
}
],
"binding": {
"device": 2,
"group": "pinmame.output.solenoid"
},
"id": "coil.bjet",
"kind": "coil",
"label": "BJet",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "3"
}
],
"binding": {
"device": 3,
"group": "pinmame.output.solenoid"
},
"id": "coil.gate",
"kind": "coil",
"label": "Gate",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "4"
}
],
"binding": {
"device": 4,
"group": "pinmame.output.solenoid"
},
"id": "coil.tljet",
"kind": "coil",
"label": "TLJet",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "5"
}
],
"binding": {
"device": 5,
"group": "pinmame.output.solenoid"
},
"id": "coil.eject",
"kind": "coil",
"label": "Eject",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "8"
}
],
"binding": {
"device": 8,
"group": "pinmame.output.solenoid"
},
"id": "coil.saucer1",
"kind": "coil",
"label": "Saucer1",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "9"
}
],
"binding": {
"device": 9,
"group": "pinmame.output.solenoid"
},
"id": "coil.lsling",
"kind": "coil",
"label": "LSling",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "10"
}
],
"binding": {
"device": 10,
"group": "pinmame.output.solenoid"
},
"id": "coil.out-hole",
"kind": "coil",
"label": "Out Hole",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "12"
}
],
"binding": {
"device": 12,
"group": "pinmame.output.solenoid"
},
"id": "coil.reject",
"kind": "coil",
"label": "REject",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.output.solenoid"
},
"id": "coil.rsling",
"kind": "coil",
"label": "RSling",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "14"
}
],
"binding": {
"device": 14,
"group": "pinmame.output.solenoid"
},
"id": "coil.saucer2",
"kind": "coil",
"label": "Saucer2",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.output.solenoid"
},
"id": "coil.trjet",
"kind": "coil",
"label": "TRJet",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker",
"kind": "coil",
"label": "Knocker",
"provenance": {
"source_refs": [
"vpx-script.617f4d9fd30aa8af"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Airborne Avenger (Atari 1977) 1.3.vbs and repository contributors",
"id": "vpx-script.617f4d9fd30aa8af",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Airborne Avenger (Atari 1977) 1.3.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "617f4d9fd30aa8af273d81cc848bda6feee4aed993241dae1e0787729e52de54",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,741 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "atarians",
"description": "Atarians, The (Free Play)",
"flags": 0,
"id": "atarianf",
"manufacturer": "Atari",
"year": "1976"
},
{
"description": "Atarians, The",
"flags": 0,
"id": "atarians",
"manufacturer": "Atari",
"year": "1976"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "9"
}
],
"binding": {
"device": 9,
"group": "pinmame.input.switch"
},
"id": "switch.trigger1",
"kind": "switch",
"label": "Trigger1",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "10"
}
],
"binding": {
"device": 10,
"group": "pinmame.input.switch"
},
"id": "switch.target2",
"kind": "switch",
"label": "Target2",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "11"
}
],
"binding": {
"device": 11,
"group": "pinmame.input.switch"
},
"id": "switch.target3",
"kind": "switch",
"label": "Target3",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "12"
}
],
"binding": {
"device": 12,
"group": "pinmame.input.switch"
},
"id": "switch.trigger4",
"kind": "switch",
"label": "Trigger4",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.input.switch"
},
"id": "switch.trigger5",
"kind": "switch",
"label": "Trigger5",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "14"
}
],
"binding": {
"device": 14,
"group": "pinmame.input.switch"
},
"id": "switch.trigger6",
"kind": "switch",
"label": "Trigger6",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "15"
}
],
"binding": {
"device": 15,
"group": "pinmame.input.switch"
},
"id": "switch.trigger7",
"kind": "switch",
"label": "Trigger7",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.input.switch"
},
"id": "switch.target8",
"kind": "switch",
"label": "Target8",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.target9",
"kind": "switch",
"label": "Target9",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.trigger-top-left",
"kind": "switch",
"label": "Trigger Top Left",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.input.switch"
},
"id": "switch.center-island-slingshot",
"kind": "switch",
"label": "Center Island Slingshot",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "20"
}
],
"binding": {
"device": 20,
"group": "pinmame.input.switch"
},
"id": "switch.trigger-open-left",
"kind": "switch",
"label": "Trigger Open Left",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.trigger-open-right",
"kind": "switch",
"label": "Trigger Open Right",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.trigger-close-left",
"kind": "switch",
"label": "Trigger Close Left",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.bumper-left",
"kind": "switch",
"label": "Bumper Left",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.bumper-right",
"kind": "switch",
"label": "Bumper Right",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.bumper-center",
"kind": "switch",
"label": "Bumper Center",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.left-slingshot-bounce",
"kind": "switch",
"label": "Left Slingshot Bounce",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.input.switch"
},
"id": "switch.right-slingshot-bounce",
"kind": "switch",
"label": "Right Slingshot Bounce",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-a",
"kind": "switch",
"label": "Kicker A",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-t",
"kind": "switch",
"label": "Kicker T",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "30"
}
],
"binding": {
"device": 30,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-e",
"kind": "switch",
"label": "Kicker E",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "31"
}
],
"binding": {
"device": 31,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-r",
"kind": "switch",
"label": "Kicker R",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-i",
"kind": "switch",
"label": "Kicker I",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "33"
}
],
"binding": {
"device": 33,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-bonus",
"kind": "switch",
"label": "Kicker Bonus",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.kicker-eb",
"kind": "switch",
"label": "Kicker EB",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/atari/atarians-1976.md",
"status": "partial"
},
"machine": {
"id": "atari.atarians.1976",
"ipdb_id": 102,
"manufacturer": "Atari",
"name": "Atarians",
"opdb_id": "Gry9N-MQYVj",
"year": 1976
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "3"
}
],
"binding": {
"device": 3,
"group": "pinmame.output.solenoid"
},
"id": "coil.kicker-bonus-out",
"kind": "coil",
"label": "Kicker Bonus Out",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "8"
}
],
"binding": {
"device": 8,
"group": "pinmame.output.solenoid"
},
"id": "coil.kicker-ebout",
"kind": "coil",
"label": "Kicker EBOut",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "14"
}
],
"binding": {
"device": 14,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-atari",
"kind": "coil",
"label": "Sol Atari",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-right-gate",
"kind": "coil",
"label": "Sol Right Gate",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.output.solenoid"
},
"id": "coil.sol-left-gate",
"kind": "coil",
"label": "Sol Left Gate",
"provenance": {
"source_refs": [
"vpx-script.aa9a3e1b8bc68733"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Atarians (Atari 1976).vbs and repository contributors",
"id": "vpx-script.aa9a3e1b8bc68733",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Atarians (Atari 1976).vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "aa9a3e1b8bc68733dd03fcf77d1895dcd93b6ef5913f1b48ab4e2f3c186c74ee",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,796 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Hercules",
"flags": 0,
"id": "hercules",
"manufacturer": "Atari",
"year": "1979"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "12"
}
],
"binding": {
"device": 12,
"group": "pinmame.input.switch"
},
"id": "switch.roll3",
"kind": "switch",
"label": "Roll3",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.input.switch"
},
"id": "switch.roll1",
"kind": "switch",
"label": "Roll1",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.roll6",
"kind": "switch",
"label": "Roll6",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.input.switch"
},
"id": "switch.roll7",
"kind": "switch",
"label": "Roll7",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "20"
}
],
"binding": {
"device": 20,
"group": "pinmame.input.switch"
},
"id": "switch.roll8",
"kind": "switch",
"label": "Roll8",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.lane1",
"kind": "switch",
"label": "Lane1",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.lane2",
"kind": "switch",
"label": "Lane2",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.lane3",
"kind": "switch",
"label": "Lane3",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.roll2",
"kind": "switch",
"label": "Roll2",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.left-out-lane",
"kind": "switch",
"label": "Left Out Lane",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.left-in-lane",
"kind": "switch",
"label": "Left In Lane",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.right-in-lane",
"kind": "switch",
"label": "Right In Lane",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "33"
}
],
"binding": {
"device": 33,
"group": "pinmame.input.switch"
},
"id": "switch.right-out-lane",
"kind": "switch",
"label": "Right Out Lane",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.s-l-target",
"kind": "switch",
"label": "S L Target",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "35"
}
],
"binding": {
"device": 35,
"group": "pinmame.input.switch"
},
"id": "switch.s-top-p",
"kind": "switch",
"label": "S Top P",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.s-r-target",
"kind": "switch",
"label": "S R Target",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "37"
}
],
"binding": {
"device": 37,
"group": "pinmame.input.switch"
},
"id": "switch.s-top-y",
"kind": "switch",
"label": "S Top Y",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "40"
}
],
"binding": {
"device": 40,
"group": "pinmame.input.switch"
},
"id": "switch.spinner1",
"kind": "switch",
"label": "Spinner1",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "52"
}
],
"binding": {
"device": 52,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "53"
}
],
"binding": {
"device": 53,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "56"
}
],
"binding": {
"device": 56,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "57"
}
],
"binding": {
"device": 57,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/atari/hercules-1979.md",
"status": "partial"
},
"machine": {
"id": "atari.hercules.1979",
"ipdb_id": 1155,
"manufacturer": "Atari",
"name": "Hercules",
"opdb_id": "G4NOx-MyNYZ",
"year": 1979
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "3"
}
],
"binding": {
"device": 3,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker",
"kind": "coil",
"label": "Knocker",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "4"
}
],
"binding": {
"device": 4,
"group": "pinmame.output.solenoid"
},
"id": "coil.rjet",
"kind": "coil",
"label": "RJet",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "5"
}
],
"binding": {
"device": 5,
"group": "pinmame.output.solenoid"
},
"id": "coil.ljet",
"kind": "coil",
"label": "LJet",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "8"
}
],
"binding": {
"device": 8,
"group": "pinmame.output.solenoid"
},
"id": "coil.rsling",
"kind": "coil",
"label": "RSling",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "9"
}
],
"binding": {
"device": 9,
"group": "pinmame.output.solenoid"
},
"id": "coil.lsling",
"kind": "coil",
"label": "LSling",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "10"
}
],
"binding": {
"device": 10,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker2",
"kind": "coil",
"label": "Knocker2",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "11"
}
],
"binding": {
"device": 11,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker3",
"kind": "coil",
"label": "Knocker3",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "12"
}
],
"binding": {
"device": 12,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker4",
"kind": "coil",
"label": "Knocker4",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker5",
"kind": "coil",
"label": "Knocker5",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "15"
}
],
"binding": {
"device": 15,
"group": "pinmame.output.solenoid"
},
"id": "coil.ball-release",
"kind": "coil",
"label": "Ball Release",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.output.solenoid"
},
"id": "coil.enable",
"kind": "coil",
"label": "Enable",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.output.solenoid"
},
"id": "coil.clo",
"kind": "coil",
"label": "CLo",
"provenance": {
"source_refs": [
"vpx-script.006914a5da06e874"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Hercules_wip1_6.vbs and repository contributors",
"id": "vpx-script.006914a5da06e874",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Hercules_wip1_6.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "006914a5da06e87482432835817473477d371635f26b70f365974a3211b79334",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,715 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "midearth",
"description": "Middle Earth (alternate)",
"flags": 0,
"id": "midearta",
"manufacturer": "Atari",
"year": "197?"
},
{
"clone_of": "midearth",
"description": "Middle Earth (Free Play)",
"flags": 0,
"id": "mideartf",
"manufacturer": "Atari",
"year": "2024"
},
{
"description": "Middle Earth",
"flags": 0,
"id": "midearth",
"manufacturer": "Atari",
"year": "1978"
},
{
"clone_of": "midearth",
"description": "Middle Earth (Prototype or German)",
"flags": 0,
"id": "mideartp",
"manufacturer": "Atari",
"year": "197?"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "21"
}
],
"binding": {
"device": 21,
"group": "pinmame.input.switch"
},
"id": "switch.sw21",
"kind": "switch",
"label": "Sw21",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "22"
}
],
"binding": {
"device": 22,
"group": "pinmame.input.switch"
},
"id": "switch.sw22",
"kind": "switch",
"label": "Sw22",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "23"
}
],
"binding": {
"device": 23,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "33"
}
],
"binding": {
"device": 33,
"group": "pinmame.input.switch"
},
"id": "switch.sw33",
"kind": "switch",
"label": "Sw33",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.sw34",
"kind": "switch",
"label": "Sw34",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "35"
}
],
"binding": {
"device": 35,
"group": "pinmame.input.switch"
},
"id": "switch.sw35",
"kind": "switch",
"label": "Sw35",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.sw36",
"kind": "switch",
"label": "Sw36",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "37"
}
],
"binding": {
"device": 37,
"group": "pinmame.input.switch"
},
"id": "switch.sw37",
"kind": "switch",
"label": "Sw37",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "38"
}
],
"binding": {
"device": 38,
"group": "pinmame.input.switch"
},
"id": "switch.sw38",
"kind": "switch",
"label": "Sw38",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "42"
}
],
"binding": {
"device": 42,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "43"
}
],
"binding": {
"device": 43,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "44"
}
],
"binding": {
"device": 44,
"group": "pinmame.input.switch"
},
"id": "switch.sw44",
"kind": "switch",
"label": "Sw44",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "45"
}
],
"binding": {
"device": 45,
"group": "pinmame.input.switch"
},
"id": "switch.sw45",
"kind": "switch",
"label": "Sw45",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "46"
}
],
"binding": {
"device": 46,
"group": "pinmame.input.switch"
},
"id": "switch.sw46",
"kind": "switch",
"label": "Sw46",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "47"
}
],
"binding": {
"device": 47,
"group": "pinmame.input.switch"
},
"id": "switch.sw47",
"kind": "switch",
"label": "Sw47",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "48"
}
],
"binding": {
"device": 48,
"group": "pinmame.input.switch"
},
"id": "switch.sw48",
"kind": "switch",
"label": "Sw48",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "49"
}
],
"binding": {
"device": 49,
"group": "pinmame.input.switch"
},
"id": "switch.sw49",
"kind": "switch",
"label": "Sw49",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "51"
}
],
"binding": {
"device": 51,
"group": "pinmame.input.switch"
},
"id": "switch.sp51",
"kind": "switch",
"label": "Sp51",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "54"
}
],
"binding": {
"device": 54,
"group": "pinmame.input.switch"
},
"id": "switch.sw54",
"kind": "switch",
"label": "Sw54",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "55"
}
],
"binding": {
"device": 55,
"group": "pinmame.input.switch"
},
"id": "switch.sp55",
"kind": "switch",
"label": "Sp55",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/atari/middle-earth-1978.md",
"status": "partial"
},
"machine": {
"id": "atari.middle-earth.1978",
"ipdb_id": 1590,
"manufacturer": "Atari",
"name": "Middle Earth",
"opdb_id": "G4OzV-MJN4z",
"year": 1978
},
"mechanisms": [],
"outputs": [
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "1"
}
],
"binding": {
"device": 1,
"group": "pinmame.output.solenoid"
},
"id": "coil.bumper2",
"kind": "coil",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "2"
}
],
"binding": {
"device": 2,
"group": "pinmame.output.solenoid"
},
"id": "coil.outhole",
"kind": "coil",
"label": "Outhole",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "4"
}
],
"binding": {
"device": 4,
"group": "pinmame.output.solenoid"
},
"id": "coil.bumper1",
"kind": "coil",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "7"
}
],
"binding": {
"device": 7,
"group": "pinmame.output.solenoid"
},
"id": "coil.knocker",
"kind": "coil",
"label": "Knocker",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "9"
}
],
"binding": {
"device": 9,
"group": "pinmame.output.solenoid"
},
"id": "coil.rsling",
"kind": "coil",
"label": "RSling",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "10"
}
],
"binding": {
"device": 10,
"group": "pinmame.output.solenoid"
},
"id": "coil.rreset",
"kind": "coil",
"label": "RReset",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "11"
}
],
"binding": {
"device": 11,
"group": "pinmame.output.solenoid"
},
"id": "coil.lreset",
"kind": "coil",
"label": "LReset",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.solenoid",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.output.solenoid"
},
"id": "coil.lsling",
"kind": "coil",
"label": "LSling",
"provenance": {
"source_refs": [
"vpx-script.d694406c2fdf88d2"
],
"status": "candidate"
}
}
],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Middle Earth (Atari 1978) V1.00.vbs and repository contributors",
"id": "vpx-script.d694406c2fdf88d2",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Middle Earth (Atari 1978) V1.00.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "d694406c2fdf88d207b24219ad1bfcc95a328b03f74088c6cc8568065f4eca25",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,606 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Road Runner (Prototype)",
"flags": 0,
"id": "roadrunr",
"manufacturer": "Atari",
"year": "1979"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "13"
}
],
"binding": {
"device": 13,
"group": "pinmame.input.switch"
},
"id": "switch.conf13",
"kind": "switch",
"label": "Conf13",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.input.switch"
},
"id": "switch.conf16",
"kind": "switch",
"label": "Conf16",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.conf17",
"kind": "switch",
"label": "Conf17",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.conf18",
"kind": "switch",
"label": "Conf18",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.input.switch"
},
"id": "switch.conf19",
"kind": "switch",
"label": "Conf19",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "24"
}
],
"binding": {
"device": 24,
"group": "pinmame.input.switch"
},
"id": "switch.conf24",
"kind": "switch",
"label": "Conf24",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "25"
}
],
"binding": {
"device": 25,
"group": "pinmame.input.switch"
},
"id": "switch.conf25",
"kind": "switch",
"label": "Conf25",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "26"
}
],
"binding": {
"device": 26,
"group": "pinmame.input.switch"
},
"id": "switch.conf26",
"kind": "switch",
"label": "Conf26",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.input.switch"
},
"id": "switch.conf27",
"kind": "switch",
"label": "Conf27",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.conf28",
"kind": "switch",
"label": "Conf28",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.conf36",
"kind": "switch",
"label": "Conf36",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "37"
}
],
"binding": {
"device": 37,
"group": "pinmame.input.switch"
},
"id": "switch.conf37",
"kind": "switch",
"label": "Conf37",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "40"
}
],
"binding": {
"device": 40,
"group": "pinmame.input.switch"
},
"id": "switch.conf40",
"kind": "switch",
"label": "Conf40",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "41"
}
],
"binding": {
"device": 41,
"group": "pinmame.input.switch"
},
"id": "switch.conf41",
"kind": "switch",
"label": "Conf41",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "42"
}
],
"binding": {
"device": 42,
"group": "pinmame.input.switch"
},
"id": "switch.conf42",
"kind": "switch",
"label": "Conf42",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "43"
}
],
"binding": {
"device": 43,
"group": "pinmame.input.switch"
},
"id": "switch.conf43",
"kind": "switch",
"label": "Conf43",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "44"
}
],
"binding": {
"device": 44,
"group": "pinmame.input.switch"
},
"id": "switch.conf44",
"kind": "switch",
"label": "Conf44",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "45"
}
],
"binding": {
"device": 45,
"group": "pinmame.input.switch"
},
"id": "switch.conf45",
"kind": "switch",
"label": "Conf45",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "49"
}
],
"binding": {
"device": 49,
"group": "pinmame.input.switch"
},
"id": "switch.conf49",
"kind": "switch",
"label": "Conf49",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "50"
}
],
"binding": {
"device": 50,
"group": "pinmame.input.switch"
},
"id": "switch.conf50",
"kind": "switch",
"label": "Conf50",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "51"
}
],
"binding": {
"device": 51,
"group": "pinmame.input.switch"
},
"id": "switch.conf51",
"kind": "switch",
"label": "Conf51",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "56"
}
],
"binding": {
"device": 56,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "57"
}
],
"binding": {
"device": 57,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "58"
}
],
"binding": {
"device": 58,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "59"
}
],
"binding": {
"device": 59,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.30f91f439099524e"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/atari/road-runner-1979.md",
"status": "partial"
},
"machine": {
"id": "atari.road-runner.1979",
"ipdb_id": 3517,
"manufacturer": "Atari",
"name": "Road Runner",
"opdb_id": "G421X-ME0nK",
"year": 1979
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Road Runner (Atari 1979) - Remastered v3.0.vbs and repository contributors",
"id": "vpx-script.30f91f439099524e",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Road Runner (Atari 1979) - Remastered v3.0.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "30f91f439099524e7e7f5236c664655ffba28a6b2ef74a8dfbdc590fe3e04235",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,78 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "spcrider",
"description": "Space Riders (Free Play)",
"flags": 0,
"id": "spcridef",
"manufacturer": "Atari",
"year": "2024"
},
{
"description": "Space Riders",
"flags": 0,
"id": "spcrider",
"manufacturer": "Atari",
"year": "1978"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/atari/space-riders-1978.md",
"status": "partial"
},
"machine": {
"id": "atari.space-riders.1978",
"ipdb_id": 2258,
"manufacturer": "Atari",
"name": "Space Riders",
"opdb_id": "GrdzE-MQ2E6",
"year": 1978
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,585 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Superman",
"flags": 0,
"id": "superman",
"manufacturer": "Atari",
"year": "1979"
}
],
"format": "pinmame-machine-definition",
"inputs": [
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "16"
}
],
"binding": {
"device": 16,
"group": "pinmame.input.switch"
},
"id": "switch.sw16",
"kind": "switch",
"label": "Sw16",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "17"
}
],
"binding": {
"device": 17,
"group": "pinmame.input.switch"
},
"id": "switch.sw17",
"kind": "switch",
"label": "Sw17",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "18"
}
],
"binding": {
"device": 18,
"group": "pinmame.input.switch"
},
"id": "switch.sw18",
"kind": "switch",
"label": "Sw18",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "19"
}
],
"binding": {
"device": 19,
"group": "pinmame.input.switch"
},
"id": "switch.sw19",
"kind": "switch",
"label": "Sw19",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "20"
}
],
"binding": {
"device": 20,
"group": "pinmame.input.switch"
},
"id": "switch.sw201",
"kind": "switch",
"label": "Sw201",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "27"
}
],
"binding": {
"device": 27,
"group": "pinmame.input.switch"
},
"id": "switch.sw27",
"kind": "switch",
"label": "Sw27",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "28"
}
],
"binding": {
"device": 28,
"group": "pinmame.input.switch"
},
"id": "switch.sw28",
"kind": "switch",
"label": "Sw28",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "29"
}
],
"binding": {
"device": 29,
"group": "pinmame.input.switch"
},
"id": "switch.sw29",
"kind": "switch",
"label": "Sw29",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "32"
}
],
"binding": {
"device": 32,
"group": "pinmame.input.switch"
},
"id": "switch.sw32",
"kind": "switch",
"label": "Sw32",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "33"
}
],
"binding": {
"device": 33,
"group": "pinmame.input.switch"
},
"id": "switch.sw33",
"kind": "switch",
"label": "Sw33",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "34"
}
],
"binding": {
"device": 34,
"group": "pinmame.input.switch"
},
"id": "switch.sw34",
"kind": "switch",
"label": "Sw34",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "35"
}
],
"binding": {
"device": 35,
"group": "pinmame.input.switch"
},
"id": "switch.sw35",
"kind": "switch",
"label": "Sw35",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "36"
}
],
"binding": {
"device": 36,
"group": "pinmame.input.switch"
},
"id": "switch.sw36",
"kind": "switch",
"label": "Sw36",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "40"
}
],
"binding": {
"device": 40,
"group": "pinmame.input.switch"
},
"id": "switch.sw40",
"kind": "switch",
"label": "Sw40",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "41"
}
],
"binding": {
"device": 41,
"group": "pinmame.input.switch"
},
"id": "switch.sw41",
"kind": "switch",
"label": "Sw41",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "42"
}
],
"binding": {
"device": 42,
"group": "pinmame.input.switch"
},
"id": "switch.sw42",
"kind": "switch",
"label": "Sw42",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "52"
}
],
"binding": {
"device": 52,
"group": "pinmame.input.switch"
},
"id": "switch.bumper1",
"kind": "switch",
"label": "Bumper1",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "53"
}
],
"binding": {
"device": 53,
"group": "pinmame.input.switch"
},
"id": "switch.bumper4",
"kind": "switch",
"label": "Bumper4",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "56"
}
],
"binding": {
"device": 56,
"group": "pinmame.input.switch"
},
"id": "switch.bumper2",
"kind": "switch",
"label": "Bumper2",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "57"
}
],
"binding": {
"device": 57,
"group": "pinmame.input.switch"
},
"id": "switch.right-sling-shot",
"kind": "switch",
"label": "Right Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "58"
}
],
"binding": {
"device": 58,
"group": "pinmame.input.switch"
},
"id": "switch.left-sling-shot",
"kind": "switch",
"label": "Left Sling Shot",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "59"
}
],
"binding": {
"device": 59,
"group": "pinmame.input.switch"
},
"id": "switch.bumper3",
"kind": "switch",
"label": "Bumper3",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "60"
}
],
"binding": {
"device": 60,
"group": "pinmame.input.switch"
},
"id": "switch.spinner",
"kind": "switch",
"label": "Spinner",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
},
{
"aliases": [
{
"namespace": "pinmame.switch",
"value": "61"
}
],
"binding": {
"device": 61,
"group": "pinmame.input.switch"
},
"id": "switch.spinner1",
"kind": "switch",
"label": "Spinner1",
"provenance": {
"source_refs": [
"vpx-script.631f01be04fc5879"
],
"status": "candidate"
}
}
],
"knowledge": {
"path": "knowledge/atari/superman-1979.md",
"status": "partial"
},
"machine": {
"id": "atari.superman.1979",
"ipdb_id": 2454,
"manufacturer": "Atari",
"name": "Superman",
"opdb_id": "GR73N-MwN9x",
"year": 1979
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "Authors credited in Superman (Atari 1979) 1.2a.vbs and repository contributors",
"id": "vpx-script.631f01be04fc5879",
"kind": "vpx_script",
"license": "NOASSERTION",
"locator": "vpxtable-scripts: Superman (Atari 1979) 1.2a.vbs",
"revision": "0c036bb61b4b4e8c778c37559f6795df8cd1521e",
"sha256": "631f01be04fc58793761513c6407bccade1fd91cc18ec42ec3f1e5ca670fce2f",
"uri": "https://github.com/sverrewl/vpxtable_scripts"
}
]
}
@@ -0,0 +1,78 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"clone_of": "time2000",
"description": "Time 2000 (Free Play)",
"flags": 0,
"id": "tim2000f",
"manufacturer": "Atari",
"year": "1977"
},
{
"description": "Time 2000",
"flags": 0,
"id": "time2000",
"manufacturer": "Atari",
"year": "1977"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/atari/time-2000-1977.md",
"status": "partial"
},
"machine": {
"id": "atari.time-2000.1977",
"ipdb_id": 2567,
"manufacturer": "Atari",
"name": "Time 2000",
"opdb_id": "G48Dx-MLleq",
"year": 1977
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,82 @@
{
"conflicts": [],
"controller": {
"inversion_applied_by_emulator": true,
"platform": "pinmame.by35"
},
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"identity",
"driver_mapping",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Big Bat",
"flags": 0,
"id": "bigbat",
"manufacturer": "Bally Midway",
"year": "1984"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/bally-midway/big-bat-1984.md",
"status": "partial"
},
"machine": {
"id": "bally-midway.big-bat.1984",
"kind": "physical_pinball",
"manufacturer": "Bally Midway",
"name": "Big Bat",
"year": 1984
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
},
{
"attribution": "PinMAME contributors",
"id": "pinmame.core.8371478a7640",
"kind": "pinmame_core",
"license": "BSD-3-Clause",
"locator": "src/wpc/bowlgames.c:201 (machine module by35_mBY35_61S)",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
@@ -0,0 +1,69 @@
{
"conflicts": [],
"coverage": {
"dimensions": {
"address_enumeration": "unknown",
"catalog_identity": "validated",
"mechanisms": "unknown",
"physical_wiring": "unknown",
"recreation_knowledge": "unknown",
"semantic_naming": "unknown",
"variant_coverage": "candidate"
},
"missing": [
"identity",
"driver_mapping",
"controller_platform",
"input_enumeration",
"input_semantics",
"output_enumeration",
"output_semantics",
"display_inventory",
"mechanism_inventory",
"mechanism_behavior",
"polarity",
"variant_differences",
"recreation_notes",
"provenance",
"spatial_placement"
],
"status": "partial"
},
"displays": [],
"drivers": [
{
"description": "Midnight Marauders (Gun game)",
"flags": 0,
"id": "mdntmrdr",
"manufacturer": "Bally Midway",
"year": "1984"
}
],
"format": "pinmame-machine-definition",
"inputs": [],
"knowledge": {
"path": "knowledge/bally-midway/midnight-marauders-gun-game-1984.md",
"status": "partial"
},
"machine": {
"id": "bally-midway.midnight-marauders-gun-game.1984",
"manufacturer": "Bally Midway",
"name": "Midnight Marauders (Gun game)",
"year": 1984
},
"mechanisms": [],
"outputs": [],
"relationships": [],
"schema_version": 1,
"sources": [
{
"attribution": "PinMAME contributors",
"id": "pinmame.catalog.8371478a7640",
"kind": "pinmame_catalog",
"license": "BSD-3-Clause",
"locator": "PinmameGetGames",
"revision": "8371478a7640f1896dcdf565aed340dc5df989ba",
"uri": "https://github.com/vpinball/pinmame"
}
]
}
Loaded 100 of 1282 files, more files were not shown because too many files have changed in this diff. Show more