├── .gitattributes ├── platforms ├── zaccaria-gen2.json ├── gottlieb-system3.json ├── williams-system9-16K.json ├── dataeast-v1.json ├── zaccaria-gen1.json ├── whitestar.json ├── williams-system11-40K.json ├── williams-system11-48K.json ├── williams-system9-12K.json ├── williams-wpc-8K.json ├── williams-wpc-12K.json ├── dataeast.json ├── stern-sam.json ├── stern-m100.json ├── bally-17-4K.json ├── gottlieb-system80.json ├── zaccaria-proto.json ├── bally-17-3K.json ├── bally-35-6K.json ├── williams-system4.json ├── williams-system6-6K.json ├── gottlieb-system80b-10K.json ├── gottlieb-system80b-8K.json ├── stern-m200.json ├── williams-system6-8K.json ├── williams-system7-8K.json ├── bally-35-8K.json ├── williams-system7-12K.json ├── williams-system7-10K.json ├── gottlieb-system80b-12K.json └── williams-system6-7.5K.json ├── .editorconfig ├── maps ├── bally │ └── as-2518-35 │ │ ├── README.md │ │ ├── rapidfir.map.json │ │ ├── kissc.map.json │ │ ├── lostwrld.map.json │ │ ├── smman.map.json │ │ ├── smmanc.map.json │ │ └── skatebll.map.json ├── zaccaria │ ├── strike.map.json │ ├── gen2 │ │ ├── farfalla.map.json │ │ ├── robot.map.json │ │ ├── mcastle.map.json │ │ ├── socrking.map.json │ │ ├── tmachzac.map.json │ │ ├── pinchamp.map.json │ │ └── dvlrider.map.json │ └── gen1 │ │ ├── strapids.map.json │ │ ├── hod.map.json │ │ └── stargoda.map.json ├── williams │ ├── system11 │ │ ├── README.md │ │ └── gmine_l2.map.json │ └── wpc │ │ └── dm_dt101.map.json ├── sega │ └── whitestar │ │ ├── gldneye.map.json │ │ ├── jplstw22.map.json │ │ ├── swtril43.map.json │ │ └── sprk_103.map.json ├── dataeast │ ├── version1 │ │ └── lwar_a83.map.json │ ├── version2 │ │ ├── poto_a32.map.json │ │ ├── generic.map.json │ │ ├── play_a24.map.json │ │ └── mnfb_c27.map.json │ ├── version3b │ │ └── baywatch.map.json │ └── version3 │ │ ├── btmn_106.map.json │ │ ├── tomy_400.map.json │ │ ├── gnr_300.map.json │ │ └── trek_201.map.json ├── stern │ ├── whitestar │ │ ├── rip300.map.json │ │ ├── simpprty.map.json │ │ ├── ripleys.map.json │ │ ├── sopranos.map.json │ │ ├── lotr.map.json │ │ └── strikext.map.json │ ├── sam │ │ ├── st_162.map.json │ │ ├── st_161h.map.json │ │ ├── st_162h.map.json │ │ └── tf_180.map.json │ └── stern-m100.map.json └── gottlieb │ └── system3 │ ├── cueball.map.json │ └── freddy.map.json ├── tools ├── reformat-json.sh ├── update-romnames.py ├── update-index.py ├── set-platform.py └── normalize-map.py └── .github └── workflows └── validate.yml /.gitattributes: -------------------------------------------------------------------------------- 1 | *.sh text eol=lf 2 | *.py text eol=lf 3 | 4 | -------------------------------------------------------------------------------- /platforms/zaccaria-gen2.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Zaccaria Gen 2 games, 3MHz Signetics 2650, 2KB NVRAM", 3 | "cpu": "S2650", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "label": "NVRAM", 8 | "address": "0x1800", 9 | "size": "0x800", 10 | "type": "nvram", 11 | "nibble": "low" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://editorconfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | charset = utf-8 11 | 12 | # Standardized format for maps. See normalize-map.sh for jq script to reformat a file. 13 | [*.json] 14 | indent_style = space 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /platforms/gottlieb-system3.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "65C02 @ 4MHz, 8KB of NVRAM at address 0x0000", 3 | "cpu": "65C02", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x2000", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "ROM", 14 | "address": "0x4000", 15 | "size": "0xC000", 16 | "type": "rom" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /platforms/williams-system9-16K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 9: 6808 @ 1MHz, 2KB of NVRAM at address 0x0000", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x0800", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "ROM U20", 14 | "address": "0x8000", 15 | "size": "0x4000", 16 | "type": "rom" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /platforms/dataeast-v1.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "6808 @ 1MHz, 2KB of NVRAM at address 0x0000", 4 | "Similar to Williams System 11, but 8KB of NVRAM." 5 | ], 6 | "cpu": "6808", 7 | "endian": "big", 8 | "memory_layout": [ 9 | { 10 | "label": "RAM", 11 | "address": "0x0000", 12 | "size": "0x800", 13 | "type": "nvram" 14 | }, 15 | { 16 | "label": "ROM 5C", 17 | "address": "0x8000", 18 | "size": "0x8000", 19 | "type": "rom" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/README.md: -------------------------------------------------------------------------------- 1 | Bally AS-2518-35 2 | ================ 3 | 4 | From "Quench" on Pinside: 5 | > The "720-37" U6 ROM used on Space Invaders removes support for 10,000 point 6 | > scores (Space Invaders doesn't have them) and adds some alternate 7 | > credit/coin settings. 8 | > The "720-37" U6 ROM completely ignores dip switch 1 and dip switch 9 in the 9 | > coins/credits settings (only uses the "Off" setting for both of these 10 | > particular switches). 11 | > The "720-35" and "720-37" U6 ROMs are otherwise identical. 12 | -------------------------------------------------------------------------------- /platforms/zaccaria-gen1.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Zaccaria Gen 1 games, 3MHz Signetics 2650, 1KB NVRAM", 3 | "cpu": "S2650", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "_notes": "might not be present on Locomotion (1981)", 8 | "label": "RAM", 9 | "address": "0x1400", 10 | "size": "0x400", 11 | "type": "ram" 12 | }, 13 | { 14 | "label": "NVRAM", 15 | "address": "0x1800", 16 | "size": "0x400", 17 | "type": "nvram", 18 | "nibble": "low" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /platforms/whitestar.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Sega/Stern Whitestar 6809 @ 2MHz, 8KB of NVRAM at address 0x0000", 3 | "cpu": "6809", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "NVRAM", 8 | "address": "0x0000", 9 | "size": "0x2000", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "Banked ROM", 14 | "address": "0x4000", 15 | "size": "0x4000", 16 | "type": "banked" 17 | }, 18 | { 19 | "label": "System ROM", 20 | "address": "0x8000", 21 | "size": "0x8000", 22 | "type": "rom" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /platforms/williams-system11-40K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 11: 6808 @ 1MHz, 2KB of NVRAM at address 0x0000", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x0800", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "ROM U26", 14 | "address": "0x4000", 15 | "size": "0x2000", 16 | "type": "rom" 17 | }, 18 | { 19 | "label": "ROM U27", 20 | "address": "0x8000", 21 | "size": "0x8000", 22 | "type": "rom" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /platforms/williams-system11-48K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 11: 6808 @ 1MHz, 2KB of NVRAM at address 0x0000", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x0800", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "ROM U26", 14 | "address": "0x4000", 15 | "size": "0x4000", 16 | "type": "rom" 17 | }, 18 | { 19 | "label": "ROM U27", 20 | "address": "0x8000", 21 | "size": "0x8000", 22 | "type": "rom" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /platforms/williams-system9-12K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 9: 6808 @ 1MHz, 2KB of NVRAM at address 0x0000", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x0800", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "ROM U19", 14 | "address": "0x5000", 15 | "size": "0x1000", 16 | "type": "rom" 17 | }, 18 | { 19 | "label": "ROM U20", 20 | "address": "0x6000", 21 | "size": "0x2000", 22 | "type": "rom" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /platforms/williams-wpc-8K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "WPC games (pre-DCS): 6809 @ 2MHz, 8KB of NVRAM at address 0x0000", 3 | "cpu": "6809", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "NVRAM", 8 | "address": "0x0000", 9 | "size": "0x2000", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "Banked ROM", 14 | "address": "0x4000", 15 | "size": "0x4000", 16 | "type": "banked" 17 | }, 18 | { 19 | "label": "System ROM", 20 | "address": "0x8000", 21 | "size": "0x8000", 22 | "type": "rom" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /platforms/williams-wpc-12K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "WPC games (DCS and later): 6809 @ 2MHz, 12KB of NVRAM at address 0x0000", 3 | "cpu": "6809", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "NVRAM", 8 | "address": "0x0000", 9 | "size": "0x3000", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "Banked ROM", 14 | "address": "0x4000", 15 | "size": "0x4000", 16 | "type": "banked" 17 | }, 18 | { 19 | "label": "System ROM", 20 | "address": "0x8000", 21 | "size": "0x8000", 22 | "type": "rom" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /platforms/dataeast.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "6808 @ 1MHz, 2KB of NVRAM at address 0x0000", 4 | "Similar to Williams System 11, but 8KB of NVRAM." 5 | ], 6 | "cpu": "6808", 7 | "endian": "big", 8 | "memory_layout": [ 9 | { 10 | "label": "RAM", 11 | "address": "0x0000", 12 | "size": "0x2000", 13 | "type": "nvram" 14 | }, 15 | { 16 | "label": "ROM 5B", 17 | "address": "0x4000", 18 | "size": "0x4000", 19 | "type": "rom" 20 | }, 21 | { 22 | "label": "ROM 5C", 23 | "address": "0x8000", 24 | "size": "0x8000", 25 | "type": "rom" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /platforms/stern-sam.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Stern SAM AT91R40008 @ 40MHz, 128KB of NVRAM at address 0x02100000.", 4 | "Multiple areas of RAM according to PinMAME." 5 | ], 6 | "cpu": "AT91", 7 | "endian": "little", 8 | "memory_layout": [ 9 | { 10 | "label": "Boot RAM", 11 | "address": "0x00000000", 12 | "size": "0x10000", 13 | "type": "ram" 14 | }, 15 | { 16 | "label": "Swapped RAM", 17 | "address": "0x00300000", 18 | "size": "0x10000", 19 | "type": "ram" 20 | }, 21 | { 22 | "label": "NVRAM", 23 | "address": "0x02100000", 24 | "size": "0x20000", 25 | "type": "nvram" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /platforms/stern-m100.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Stern M100 with two 2KB ROMs", 3 | "cpu": "6800", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x80", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x200", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "high" 18 | }, 19 | { 20 | "label": "U2 ROM", 21 | "address": "0x1000", 22 | "size": "0x800", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "U6 ROM", 27 | "address": "0x1800", 28 | "size": "0x800", 29 | "type": "rom" 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /platforms/bally-17-4K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Bally AS-2518-17 with two 2KB ROMs", 3 | "cpu": "6800", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x80", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x200", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "high" 18 | }, 19 | { 20 | "label": "U1 or U2 ROM", 21 | "address": "0x1000", 22 | "size": "0x800", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "U6 ROM", 27 | "address": "0x1800", 28 | "size": "0x800", 29 | "type": "rom" 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /tools/reformat-json.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ $# -eq 0 ] ; then 4 | echo "Usage: $0 file.json" 5 | echo '\nReformats JSON to preferred format using `jq`. Can specify multiple' 6 | echo 'files or use `*.json` to reformat all files in directory.' 7 | exit 1 8 | fi 9 | 10 | # default to SUCCESS 11 | EXITCODE=0 12 | 13 | for file in "$@" 14 | do 15 | RESULT=$(jq --indent 2 --ascii-output . "$file") 16 | STATUS=$? 17 | if [ $STATUS -ne 0 ] ; then 18 | echo "^^^ errors parsing $file ^^^" 19 | 20 | # replace exit code with most recent failure 21 | EXITCODE=$STATUS 22 | else 23 | # use printf instead of echo to avoid possible backslash escaping 24 | printf "%s\n" "$RESULT" > "$file" 25 | fi 26 | done 27 | 28 | exit $EXITCODE 29 | -------------------------------------------------------------------------------- /platforms/gottlieb-system80.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Placeholder for Gottlieb System 80/80A games (missing ROM areas).", 3 | "cpu": "6502", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RIOT1", 8 | "address": "0x0000", 9 | "size": "0x80", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "RIOT2", 14 | "address": "0x0080", 15 | "size": "0x80", 16 | "type": "ram" 17 | }, 18 | { 19 | "label": "RIOT3", 20 | "address": "0x0100", 21 | "size": "0x80", 22 | "type": "ram" 23 | }, 24 | { 25 | "label": "NVRAM", 26 | "address": "0x1800", 27 | "size": "0x100", 28 | "type": "nvram", 29 | "nibble": "low" 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /platforms/zaccaria-proto.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Zaccaria Prototype games, 1MHz National Semiconductor SC/MP ISP-8A 500D", 3 | "cpu": "SCAMP", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "label": "NVRAM", 8 | "address": "0x0D00", 9 | "size": "0x100", 10 | "type": "nvram" 11 | }, 12 | { 13 | "label": "ROM 1", 14 | "address": "0x0000", 15 | "size": "0x400", 16 | "type": "rom" 17 | }, 18 | { 19 | "label": "ROM 2", 20 | "address": "0x0400", 21 | "size": "0x400", 22 | "type": "rom" 23 | }, 24 | { 25 | "label": "ROM 3", 26 | "address": "0x0800", 27 | "size": "0x400", 28 | "type": "rom" 29 | }, 30 | { 31 | "label": "ROM 4", 32 | "address": "0x1400", 33 | "size": "0x400", 34 | "type": "rom" 35 | } 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /platforms/bally-17-3K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Bally AS-2518-17 with two 512-byte and one 2K ROMs", 3 | "cpu": "6800", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x80", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x200", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "high" 18 | }, 19 | { 20 | "label": "U1 ROM", 21 | "address": "0x1400", 22 | "size": "0x200", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "U2 ROM", 27 | "address": "0x1600", 28 | "size": "0x200", 29 | "type": "rom" 30 | }, 31 | { 32 | "label": "U6 ROM", 33 | "address": "0x1800", 34 | "size": "0x800", 35 | "type": "rom" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /platforms/bally-35-6K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Bally AS-2518-35 with 2KB ROMs in U1, U2 and U6", 3 | "cpu": "6800", 4 | "endian": "little", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM U7", 8 | "address": "0x0000", 9 | "size": "0x80", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM U8", 14 | "address": "0x200", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "high" 18 | }, 19 | { 20 | "label": "ROM U1", 21 | "address": "0x1000", 22 | "size": "0x800", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "ROM U2", 27 | "address": "0x5000", 28 | "size": "0x800", 29 | "type": "rom" 30 | }, 31 | { 32 | "label": "ROM U6", 33 | "address": "0x5800", 34 | "size": "0x800", 35 | "type": "rom" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /platforms/williams-system4.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 3/4, 6800 CPU at 895kHz, 256 byte RAM, 256 4-bit NVRAM, 3x2KB ROM", 3 | "cpu": "6800", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x100", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x0100", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "low" 18 | }, 19 | { 20 | "label": "ROM (IC14)", 21 | "address": "0x6000", 22 | "size": "0x800", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "ROM (IC20)", 27 | "address": "0x7000", 28 | "size": "0x800", 29 | "type": "rom" 30 | }, 31 | { 32 | "label": "ROM (IC17)", 33 | "address": "0x7800", 34 | "size": "0x800", 35 | "type": "rom" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /platforms/williams-system6-6K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 6, 6808 CPU at 895kHz, 256 byte RAM, 256 4-bit NVRAM, 3x2KB ROM", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x100", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x0100", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "low" 18 | }, 19 | { 20 | "label": "ROM (IC14)", 21 | "address": "0x6000", 22 | "size": "0x800", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "ROM (IC20)", 27 | "address": "0x7000", 28 | "size": "0x800", 29 | "type": "rom" 30 | }, 31 | { 32 | "label": "ROM (IC17)", 33 | "address": "0x7800", 34 | "size": "0x800", 35 | "type": "rom" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /platforms/gottlieb-system80b-10K.json: -------------------------------------------------------------------------------- 1 | { 2 | "cpu": "6502", 3 | "endian": "big", 4 | "memory_layout": [ 5 | { 6 | "label": "RIOT1", 7 | "address": "0x0000", 8 | "size": "0x80", 9 | "type": "ram" 10 | }, 11 | { 12 | "label": "RIOT2", 13 | "address": "0x0080", 14 | "size": "0x80", 15 | "type": "ram" 16 | }, 17 | { 18 | "label": "RIOT3", 19 | "address": "0x0100", 20 | "size": "0x80", 21 | "type": "ram" 22 | }, 23 | { 24 | "label": "PROM 2", 25 | "address": "0x1000", 26 | "size": "0x800", 27 | "type": "rom" 28 | }, 29 | { 30 | "label": "NVRAM", 31 | "address": "0x1800", 32 | "size": "0x100", 33 | "type": "nvram", 34 | "nibble": "low" 35 | }, 36 | { 37 | "label": "PROM 1", 38 | "address": "0x2000", 39 | "size": "0x2000", 40 | "type": "rom" 41 | } 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /platforms/gottlieb-system80b-8K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Multiple System 80B games don't have PROM2.", 4 | "Early games (Chicago Cubs, Bounty Hunter, Rock, Rock Encore) and Amazon Hunt II/III" 5 | ], 6 | "cpu": "6502", 7 | "endian": "big", 8 | "memory_layout": [ 9 | { 10 | "label": "RIOT1", 11 | "address": "0x0000", 12 | "size": "0x80", 13 | "type": "ram" 14 | }, 15 | { 16 | "label": "RIOT2", 17 | "address": "0x0080", 18 | "size": "0x80", 19 | "type": "ram" 20 | }, 21 | { 22 | "label": "RIOT3", 23 | "address": "0x0100", 24 | "size": "0x80", 25 | "type": "ram" 26 | }, 27 | { 28 | "label": "NVRAM", 29 | "address": "0x1800", 30 | "size": "0x100", 31 | "type": "nvram", 32 | "nibble": "low" 33 | }, 34 | { 35 | "label": "PROM 1", 36 | "address": "0x2000", 37 | "size": "0x2000", 38 | "type": "rom" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /platforms/stern-m200.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Similar to bally-stern-6800, but stores all 8 bits in NVRAM", 3 | "cpu": "6800", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x80", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x200", 15 | "size": "0x100", 16 | "type": "nvram" 17 | }, 18 | { 19 | "label": "ROM U1", 20 | "address": "0x1000", 21 | "size": "0x800", 22 | "type": "rom" 23 | }, 24 | { 25 | "label": "ROM U5", 26 | "address": "0x1800", 27 | "size": "0x800", 28 | "type": "rom" 29 | }, 30 | { 31 | "label": "ROM U2", 32 | "address": "0x5000", 33 | "size": "0x800", 34 | "type": "rom" 35 | }, 36 | { 37 | "label": "ROM U6", 38 | "address": "0x5800", 39 | "size": "0x800", 40 | "type": "rom" 41 | } 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /.github/workflows/validate.yml: -------------------------------------------------------------------------------- 1 | name: Validate 2 | 3 | on: 4 | push: 5 | branches: [ "master", "main" ] 6 | pull_request: 7 | branches: [ "master", "main" ] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | jobs: 13 | check: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | - name: Check for file formatting issues or outdated index.json 18 | run: | 19 | shopt -s globstar 20 | tools/reformat-json.sh **/*.json 21 | if [[ -n $(git status --porcelain) ]]; then 22 | git status 23 | echo "Some JSON files are formatted incorrectly. Please check the README on how to reformat your files." 24 | exit 1 25 | fi 26 | 27 | tools/update-index.py 28 | if [[ -n $(git status --porcelain) ]]; then 29 | echo "The index.json file is outdated." 30 | exit 1 31 | fi 32 | -------------------------------------------------------------------------------- /tools/update-romnames.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # User needs to pipe output from `pinmame -listfull` to this program. 4 | 5 | import json 6 | import os 7 | import sys 8 | 9 | 10 | if os.isatty(0): 11 | print("Usage: pinmame -listfull | update-romnames.py") 12 | exit(0) 13 | 14 | romnames = { 15 | '_note': 'Automatically generated by tools/update-romnames.py', 16 | } 17 | 18 | linecount = 0 19 | for line in sys.stdin: 20 | if linecount: 21 | # skip the first line, which is just a header 22 | line = line.strip('\n\r"') 23 | (rom, description) = line.split('"', 1) 24 | rom = rom.strip() 25 | romnames[rom] = description 26 | linecount += 1 27 | 28 | rootdir = os.path.join(os.path.dirname(__file__), '..') 29 | with open(os.path.join(rootdir, 'romnames.json'), 'w') as f: 30 | f.write(json.dumps(romnames, indent=2, sort_keys=True)) 31 | f.write('\n') # include trailing newline 32 | 33 | print('Updated romnames.json with %u names.' % (linecount - 1)) 34 | -------------------------------------------------------------------------------- /platforms/williams-system6-8K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Williams System 6, 6808 CPU at 895kHz, 256 byte RAM, 256 4-bit NVRAM, 1x4KB + 2x2KB ROM", 4 | "Used by modified ROMs for Firepower (frpwr_{a,b,c,d}6) and Alien Poker (alpok_b6)." 5 | ], 6 | "cpu": "6808", 7 | "endian": "big", 8 | "memory_layout": [ 9 | { 10 | "label": "RAM", 11 | "address": "0x0000", 12 | "size": "0x100", 13 | "type": "ram" 14 | }, 15 | { 16 | "label": "NVRAM", 17 | "address": "0x0100", 18 | "size": "0x100", 19 | "type": "nvram", 20 | "nibble": "low" 21 | }, 22 | { 23 | "label": "ROM (IC14)", 24 | "address": "0x6000", 25 | "size": "0x1000", 26 | "type": "rom" 27 | }, 28 | { 29 | "label": "ROM (IC20)", 30 | "address": "0x7000", 31 | "size": "0x800", 32 | "type": "rom" 33 | }, 34 | { 35 | "label": "ROM (IC17)", 36 | "address": "0x7800", 37 | "size": "0x800", 38 | "type": "rom" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /platforms/williams-system7-8K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 7, 6808 CPU at 895kHz, 8KB ROM (IC14, IC17, IC20)", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "_notes": "Mapped to a portion of RAM at 0x1000 (always first 256 bytes?)", 8 | "label": "Banked RAM", 9 | "address": "0x0000", 10 | "size": "0x100", 11 | "type": "ram" 12 | }, 13 | { 14 | "label": "NVRAM", 15 | "address": "0x0100", 16 | "size": "0x100", 17 | "type": "nvram", 18 | "nibble": "low" 19 | }, 20 | { 21 | "label": "RAM", 22 | "address": "0x1000", 23 | "size": "0x400", 24 | "type": "ram" 25 | }, 26 | { 27 | "label": "ROM (IC14)", 28 | "address": "0xE000", 29 | "size": "0x800", 30 | "type": "rom" 31 | }, 32 | { 33 | "label": "ROM (IC20)", 34 | "address": "0xE800", 35 | "size": "0x800", 36 | "type": "rom" 37 | }, 38 | { 39 | "label": "ROM (IC17)", 40 | "address": "0xF000", 41 | "size": "0x1000", 42 | "type": "rom" 43 | } 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /platforms/bally-35-8K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Bally AS-2518-35 with 4KB ROMs in U2 and U6", 4 | "Platform includes Cybernaut and Fireball Classic which used 6802 CPU" 5 | ], 6 | "cpu": "6800", 7 | "endian": "little", 8 | "memory_layout": [ 9 | { 10 | "label": "RAM U7", 11 | "address": "0x0000", 12 | "size": "0x80", 13 | "type": "ram" 14 | }, 15 | { 16 | "label": "NVRAM U8", 17 | "address": "0x200", 18 | "size": "0x100", 19 | "type": "nvram", 20 | "nibble": "high" 21 | }, 22 | { 23 | "label": "ROM U1 (or low 2K of U2)", 24 | "address": "0x1000", 25 | "size": "0x800", 26 | "type": "rom" 27 | }, 28 | { 29 | "label": "ROM U6 (low 2K)", 30 | "address": "0x1800", 31 | "size": "0x800", 32 | "type": "rom" 33 | }, 34 | { 35 | "label": "ROM U2 (or high 2K of U2)", 36 | "address": "0x5000", 37 | "size": "0x800", 38 | "type": "rom" 39 | }, 40 | { 41 | "label": "ROM U6 (high 2K)", 42 | "address": "0x5800", 43 | "size": "0x800", 44 | "type": "rom" 45 | } 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /platforms/williams-system7-12K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Williams System 7, 6808 CPU at 895kHz, 12KB ROM (IC14, IC17, IC20)", 4 | "Only used for Firepower games converted from System 6? (frpwr_a7, _b7, _d7, _e7)" 5 | ], 6 | "cpu": "6808", 7 | "endian": "big", 8 | "memory_layout": [ 9 | { 10 | "_notes": "Mapped to a portion of RAM at 0x1000 (always first 256 bytes?)", 11 | "label": "Banked RAM", 12 | "address": "0x0000", 13 | "size": "0x100", 14 | "type": "ram" 15 | }, 16 | { 17 | "label": "NVRAM", 18 | "address": "0x0100", 19 | "size": "0x100", 20 | "type": "nvram", 21 | "nibble": "low" 22 | }, 23 | { 24 | "label": "RAM", 25 | "address": "0x1000", 26 | "size": "0x400", 27 | "type": "ram" 28 | }, 29 | { 30 | "label": "ROM (IC20)", 31 | "address": "0xD000", 32 | "size": "0x1000", 33 | "type": "rom" 34 | }, 35 | { 36 | "label": "ROM (IC14)", 37 | "address": "0xE000", 38 | "size": "0x1000", 39 | "type": "rom" 40 | }, 41 | { 42 | "label": "ROM (IC17)", 43 | "address": "0xF000", 44 | "size": "0x1000", 45 | "type": "rom" 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /platforms/williams-system7-10K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 7, 6808 CPU at 895kHz, 10KB ROM (IC14, IC17, IC20, IC26)", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "_notes": "Mapped to a portion of RAM at 0x1000 (always first 256 bytes?)", 8 | "label": "Banked RAM", 9 | "address": "0x0000", 10 | "size": "0x100", 11 | "type": "ram" 12 | }, 13 | { 14 | "label": "NVRAM", 15 | "address": "0x0100", 16 | "size": "0x100", 17 | "type": "nvram", 18 | "nibble": "low" 19 | }, 20 | { 21 | "label": "RAM", 22 | "address": "0x1000", 23 | "size": "0x400", 24 | "type": "ram" 25 | }, 26 | { 27 | "label": "ROM (IC26)", 28 | "address": "0xD800", 29 | "size": "0x800", 30 | "type": "rom" 31 | }, 32 | { 33 | "label": "ROM (IC14)", 34 | "address": "0xE000", 35 | "size": "0x800", 36 | "type": "rom" 37 | }, 38 | { 39 | "label": "ROM (IC20)", 40 | "address": "0xE800", 41 | "size": "0x800", 42 | "type": "rom" 43 | }, 44 | { 45 | "label": "ROM (IC17)", 46 | "address": "0xF000", 47 | "size": "0x1000", 48 | "type": "rom" 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /platforms/gottlieb-system80b-12K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Games using a 2732 (4KB) PROM2. Second 2KB starts at 0x9000.", 4 | "Excalibur, Bad Girls, Big House, Hot Shots, Bone Busters, Night Moves." 5 | ], 6 | "cpu": "6502", 7 | "endian": "big", 8 | "memory_layout": [ 9 | { 10 | "label": "RIOT1", 11 | "address": "0x0000", 12 | "size": "0x80", 13 | "type": "ram" 14 | }, 15 | { 16 | "label": "RIOT2", 17 | "address": "0x0080", 18 | "size": "0x80", 19 | "type": "ram" 20 | }, 21 | { 22 | "label": "RIOT3", 23 | "address": "0x0100", 24 | "size": "0x80", 25 | "type": "ram" 26 | }, 27 | { 28 | "label": "PROM 2 (first half)", 29 | "address": "0x1000", 30 | "size": "0x800", 31 | "type": "rom" 32 | }, 33 | { 34 | "label": "NVRAM", 35 | "address": "0x1800", 36 | "size": "0x100", 37 | "type": "nvram", 38 | "nibble": "low" 39 | }, 40 | { 41 | "label": "PROM 1", 42 | "address": "0x2000", 43 | "size": "0x2000", 44 | "type": "rom" 45 | }, 46 | { 47 | "label": "PROM 2 (second half)", 48 | "address": "0x9000", 49 | "size": "0x800", 50 | "type": "rom" 51 | } 52 | ] 53 | } 54 | -------------------------------------------------------------------------------- /platforms/williams-system6-7.5K.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Williams System 6, 6808 CPU at 895kHz, 256 byte RAM, 256 4-bit NVRAM, 3x2KB+3x512B ROM", 3 | "cpu": "6808", 4 | "endian": "big", 5 | "memory_layout": [ 6 | { 7 | "label": "RAM", 8 | "address": "0x0000", 9 | "size": "0x100", 10 | "type": "ram" 11 | }, 12 | { 13 | "label": "NVRAM", 14 | "address": "0x0100", 15 | "size": "0x100", 16 | "type": "nvram", 17 | "nibble": "low" 18 | }, 19 | { 20 | "label": "ROM (IC21)", 21 | "address": "0x6000", 22 | "size": "0x200", 23 | "type": "rom" 24 | }, 25 | { 26 | "label": "ROM (IC22)", 27 | "address": "0x6200", 28 | "size": "0x200", 29 | "type": "rom" 30 | }, 31 | { 32 | "label": "ROM (IC26)", 33 | "address": "0x6400", 34 | "size": "0x200", 35 | "type": "rom" 36 | }, 37 | { 38 | "label": "ROM (IC14)", 39 | "address": "0x6800", 40 | "size": "0x800", 41 | "type": "rom" 42 | }, 43 | { 44 | "label": "ROM (IC20)", 45 | "address": "0x7000", 46 | "size": "0x800", 47 | "type": "rom" 48 | }, 49 | { 50 | "label": "ROM (IC17)", 51 | "address": "0x7800", 52 | "size": "0x800", 53 | "type": "rom" 54 | } 55 | ] 56 | } 57 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/rapidfir.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Rapid Fire (Bally 1982)", 5 | "https://www.ipdb.org/machine.cgi?id=3568", 6 | "Bally MPU AS-2518-35", 7 | "7-digit score display" 8 | ], 9 | "_fileformat": 0.7, 10 | "_metadata": { 11 | "version": 1, 12 | "copyright": [ 13 | "Copyright (C) 2024 by Francis De Brabandere ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "bally-35-8K", 18 | "roms": [ 19 | "rapidfir" 20 | ] 21 | }, 22 | "game_state": { 23 | "credits": { 24 | "label": "Credits", 25 | "start": "0x02AD", 26 | "length": 2, 27 | "encoding": "bcd" 28 | }, 29 | "scores": [ 30 | { 31 | "label": "Player 1", 32 | "start": "0x021E", 33 | "encoding": "bcd", 34 | "length": 7 35 | }, 36 | { 37 | "label": "Player 2", 38 | "start": "0x0225", 39 | "encoding": "bcd", 40 | "length": 7 41 | } 42 | ], 43 | "final_scores": [ 44 | { 45 | "label": "Final P1", 46 | "start": "0x0233", 47 | "encoding": "bcd", 48 | "length": 7 49 | }, 50 | { 51 | "label": "Final P2", 52 | "start": "0x023A", 53 | "encoding": "bcd", 54 | "length": 7 55 | } 56 | ] 57 | }, 58 | "high_scores": [] 59 | } 60 | -------------------------------------------------------------------------------- /maps/zaccaria/strike.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Strike (Zaccaria 1978)", 5 | "https://www.ipdb.org/machine.cgi?id=3363", 6 | "https://opdb.org/machines/919", 7 | "Zaccaria Prototype Solid State Generation", 8 | "Credits can go higher than 15 but are in that case displayed as 15", 9 | "High scores seem to not be saved?" 10 | ], 11 | "_fileformat": 0.7, 12 | "_metadata": { 13 | "version": 1, 14 | "copyright": [ 15 | "Copyright (C) 2024 by Francis De Brabandere ", 16 | "Copyright (C) 2025 by Tom Collins " 17 | ], 18 | "license": "GNU Lesser General Public License v3.0", 19 | "platform": "zaccaria-proto", 20 | "roms": [ 21 | "strike" 22 | ] 23 | }, 24 | "game_state": { 25 | "credits": { 26 | "_notes": "Decoding based on PinMAME investigation. DIPs might control scale?", 27 | "label": "Credits", 28 | "start": "0x0D83", 29 | "length": 1, 30 | "scale": 0.5, 31 | "encoding": "int" 32 | }, 33 | "score": { 34 | "label": "Score", 35 | "start": "0x0D80", 36 | "length": 3, 37 | "encoding": "bcd", 38 | "scale": 10 39 | }, 40 | "ball_to_play": { 41 | "label": "Ball to Play", 42 | "start": "0x0D9C", 43 | "length": 1, 44 | "encoding": "bcd" 45 | } 46 | }, 47 | "high_scores": [ 48 | { 49 | "label": "High Score", 50 | "score": { 51 | "start": "0x0D42", 52 | "length": 3, 53 | "encoding": "bcd", 54 | "scale": 10 55 | } 56 | } 57 | ] 58 | } 59 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/farfalla.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Farfalla (Zaccaria 1983)", 5 | "https://www.ipdb.org/machine.cgi?id=824", 6 | "Zaccaria Generation 2" 7 | ], 8 | "_fileformat": 0.7, 9 | "_metadata": { 10 | "version": 1, 11 | "copyright": [ 12 | "Copyright (C) 2024 by Francis De Brabandere ", 13 | "Copyright (C) 2025 by Tom Collins " 14 | ], 15 | "license": "GNU Lesser General Public License v3.0", 16 | "platform": "zaccaria-gen2", 17 | "roms": [ 18 | "farfalla" 19 | ] 20 | }, 21 | "game_state": { 22 | "credits": { 23 | "label": "Credits", 24 | "start": "0x1CE5", 25 | "length": 2, 26 | "encoding": "bcd" 27 | }, 28 | "scores": [ 29 | { 30 | "label": "Player 1", 31 | "start": "0x1CC0", 32 | "encoding": "bcd", 33 | "length": 7 34 | }, 35 | { 36 | "label": "Player 2", 37 | "start": "0x1CC8", 38 | "encoding": "bcd", 39 | "length": 7 40 | }, 41 | { 42 | "label": "Player 3", 43 | "start": "0x1CD0", 44 | "encoding": "bcd", 45 | "length": 7 46 | }, 47 | { 48 | "label": "Player 4", 49 | "start": "0x1CD8", 50 | "encoding": "bcd", 51 | "length": 7 52 | } 53 | ] 54 | }, 55 | "high_scores": [ 56 | { 57 | "label": "High Score", 58 | "short_label": "HS", 59 | "score": { 60 | "start": "0x1F44", 61 | "encoding": "bcd", 62 | "length": 7 63 | } 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /maps/williams/system11/README.md: -------------------------------------------------------------------------------- 1 | Williams System 11 Notes 2 | ======================== 3 | 4 | Here are some notes on what's stored in memory. All addresses are for 5 | High Speed (hs_l4) and could vary slightly for other games. 6 | 7 | ## Lamp Matrix 8 | The game stores base lamp matrix values from 0x10 to 0x17 (column 1-8). 9 | There are other memory areas that override those values for light shows, but 10 | this memory encodes game state (e.g., bonus, bonus X) for the current ball. 11 | 12 | ## Display Memory 13 | BCD-encoded values stored at 0x38 for ball/match display and 0x39 for credits. 14 | 15 | ## Game State 16 | There's a series of bytes that reflect the state of the current game. The 17 | starting address varies by game, but this sequence appears to be consistent 18 | across games. 19 | 20 | - 0xA8 "Tilted": Set to 0x68 when the player tilts. 21 | - 0xA9 "Game Over": set to 0 during a game, 1 when the game is over. 22 | - 0xAA: Set to 0xFF during end-of-ball and bonus routine, then 0x00 at the 23 | start of the next ball. 24 | - 0xAB: Unknown. 25 | - 0xAC "Player Count": 0x00 = 1 player and 0x03 = 4 players. 26 | - 0xAD "Current Player": 0x00 = 1 player and 0x03 = 4 players. 27 | - 0xAE/0xAF: Big-endian address of current player's score (0x200, 0x204, 28 | 0x208, 0x20C). 29 | - 0xB0: Extra balls. 30 | - 0xB1/0xB2: Unknown, but frequently changes. 31 | - 0xB3: Number of tilt warnings. 32 | 33 | ## Saved Player State 34 | The game stores 26 bytes of saved state for each player at addresses 0x328, 35 | 0x342, 0x35C, and 0x376. The saved state includes data from 0x10 to 0x1B 36 | (lamp matrix and other values), 0x30 to 0x37, and 0x02 to 0x07. 37 | -------------------------------------------------------------------------------- /maps/zaccaria/gen1/strapids.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Shooting the Rapids (Zaccaria 1979)", 5 | "https://www.ipdb.org/machine.cgi?id=3606", 6 | "Zaccaria Generation 1" 7 | ], 8 | "_fileformat": 0.7, 9 | "_metadata": { 10 | "version": 1, 11 | "copyright": [ 12 | "Copyright (C) 2024 by Francis De Brabandere ", 13 | "Copyright (C) 2025 by Tom Collins " 14 | ], 15 | "license": "GNU Lesser General Public License v3.0", 16 | "platform": "zaccaria-gen1", 17 | "roms": [ 18 | "strapids" 19 | ] 20 | }, 21 | "game_state": { 22 | "credits": { 23 | "label": "Credits", 24 | "start": "0x182C", 25 | "length": 2, 26 | "encoding": "bcd" 27 | }, 28 | "scores": [ 29 | { 30 | "label": "Player 1", 31 | "start": "0x1800", 32 | "encoding": "bcd", 33 | "length": 6 34 | }, 35 | { 36 | "label": "Player 2", 37 | "start": "0x1808", 38 | "encoding": "bcd", 39 | "length": 6 40 | }, 41 | { 42 | "label": "Player 3", 43 | "start": "0x1810", 44 | "encoding": "bcd", 45 | "length": 6 46 | }, 47 | { 48 | "label": "Player 4", 49 | "start": "0x1818", 50 | "encoding": "bcd", 51 | "length": 6 52 | } 53 | ] 54 | }, 55 | "high_scores": [ 56 | { 57 | "label": "High Score", 58 | "short_label": "HS", 59 | "score": { 60 | "start": "0x1820", 61 | "encoding": "bcd", 62 | "length": 6 63 | } 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/robot.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Robot (Zaccaria 1985)", 5 | "https://www.ipdb.org/machine.cgi?id=1977", 6 | "https://opdb.org/machines/74", 7 | "Zaccaria Generation 2" 8 | ], 9 | "_fileformat": 0.7, 10 | "_metadata": { 11 | "version": 1, 12 | "copyright": [ 13 | "Copyright (C) 2024 by Francis De Brabandere ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "zaccaria-gen2", 18 | "roms": [ 19 | "robot" 20 | ] 21 | }, 22 | "game_state": { 23 | "credits": { 24 | "label": "Credits", 25 | "start": "0x1CE6", 26 | "length": 2, 27 | "encoding": "bcd" 28 | }, 29 | "scores": [ 30 | { 31 | "label": "Player 1", 32 | "start": "0x1CC0", 33 | "encoding": "bcd", 34 | "length": 8 35 | }, 36 | { 37 | "label": "Player 2", 38 | "start": "0x1CC8", 39 | "encoding": "bcd", 40 | "length": 8 41 | }, 42 | { 43 | "label": "Player 3", 44 | "start": "0x1CD0", 45 | "encoding": "bcd", 46 | "length": 8 47 | }, 48 | { 49 | "label": "Player 4", 50 | "start": "0x1CD8", 51 | "encoding": "bcd", 52 | "length": 8 53 | } 54 | ] 55 | }, 56 | "high_scores": [ 57 | { 58 | "label": "High Score", 59 | "short_label": "HS", 60 | "score": { 61 | "start": "0x1C24", 62 | "encoding": "bcd", 63 | "length": 8 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/mcastle.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Magic Castle (Zaccaria 1984)", 5 | "https://www.ipdb.org/machine.cgi?id=1511", 6 | "https://opdb.org/machines/917", 7 | "Zaccaria Generation 2" 8 | ], 9 | "_fileformat": 0.7, 10 | "_metadata": { 11 | "version": 1, 12 | "copyright": [ 13 | "Copyright (C) 2024 by Francis De Brabandere ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "zaccaria-gen2", 18 | "roms": [ 19 | "mcastle" 20 | ] 21 | }, 22 | "game_state": { 23 | "credits": { 24 | "label": "Credits", 25 | "start": "0x1CE6", 26 | "length": 2, 27 | "encoding": "bcd" 28 | }, 29 | "scores": [ 30 | { 31 | "label": "Player 1", 32 | "start": "0x1CC0", 33 | "encoding": "bcd", 34 | "length": 8 35 | }, 36 | { 37 | "label": "Player 2", 38 | "start": "0x1CC8", 39 | "encoding": "bcd", 40 | "length": 8 41 | }, 42 | { 43 | "label": "Player 3", 44 | "start": "0x1CD0", 45 | "encoding": "bcd", 46 | "length": 8 47 | }, 48 | { 49 | "label": "Player 4", 50 | "start": "0x1CD8", 51 | "encoding": "bcd", 52 | "length": 8 53 | } 54 | ] 55 | }, 56 | "high_scores": [ 57 | { 58 | "label": "High Score", 59 | "short_label": "HS", 60 | "score": { 61 | "start": "0x1F46", 62 | "encoding": "bcd", 63 | "length": 8 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/socrking.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Soccer Kings (Zaccaria 1982)", 5 | "https://www.ipdb.org/machine.cgi?id=2235", 6 | "https://opdb.org/machines/660", 7 | "Zaccaria Generation 2" 8 | ], 9 | "_fileformat": 0.7, 10 | "_metadata": { 11 | "version": 1, 12 | "copyright": [ 13 | "Copyright (C) 2024 by Francis De Brabandere ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "zaccaria-gen2", 18 | "roms": [ 19 | "socrking" 20 | ] 21 | }, 22 | "game_state": { 23 | "credits": { 24 | "label": "Credits", 25 | "start": "0x1D8B", 26 | "length": 2, 27 | "encoding": "bcd" 28 | }, 29 | "scores": [ 30 | { 31 | "label": "Player 1", 32 | "start": "0x1CC0", 33 | "encoding": "bcd", 34 | "length": 8 35 | }, 36 | { 37 | "label": "Player 2", 38 | "start": "0x1CC8", 39 | "encoding": "bcd", 40 | "length": 8 41 | }, 42 | { 43 | "label": "Player 3", 44 | "start": "0x1CD0", 45 | "encoding": "bcd", 46 | "length": 8 47 | }, 48 | { 49 | "label": "Player 4", 50 | "start": "0x1CD8", 51 | "encoding": "bcd", 52 | "length": 8 53 | } 54 | ] 55 | }, 56 | "high_scores": [ 57 | { 58 | "label": "High Score", 59 | "short_label": "HS", 60 | "score": { 61 | "start": "0x1F44", 62 | "encoding": "bcd", 63 | "length": 8 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/tmachzac.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Time Machine (Zaccaria 1983)", 5 | "https://www.ipdb.org/machine.cgi?id=3494", 6 | "https://opdb.org/machines/937", 7 | "Zaccaria Generation 2" 8 | ], 9 | "_fileformat": 0.7, 10 | "_metadata": { 11 | "version": 1, 12 | "copyright": [ 13 | "Copyright (C) 2024 by Francis De Brabandere ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "zaccaria-gen2", 18 | "roms": [ 19 | "tmachzac" 20 | ] 21 | }, 22 | "game_state": { 23 | "credits": { 24 | "label": "Credits", 25 | "start": "0x1CE5", 26 | "length": 2, 27 | "encoding": "bcd" 28 | }, 29 | "scores": [ 30 | { 31 | "label": "Player 1", 32 | "start": "0x1CC0", 33 | "encoding": "bcd", 34 | "length": 7 35 | }, 36 | { 37 | "label": "Player 2", 38 | "start": "0x1CC8", 39 | "encoding": "bcd", 40 | "length": 7 41 | }, 42 | { 43 | "label": "Player 3", 44 | "start": "0x1CD0", 45 | "encoding": "bcd", 46 | "length": 7 47 | }, 48 | { 49 | "label": "Player 4", 50 | "start": "0x1CD8", 51 | "encoding": "bcd", 52 | "length": 7 53 | } 54 | ] 55 | }, 56 | "high_scores": [ 57 | { 58 | "label": "High Score", 59 | "short_label": "HS", 60 | "score": { 61 | "start": "0x1F44", 62 | "encoding": "bcd", 63 | "length": 7 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/pinchamp.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Pinball Champ '82 (Zaccaria 1982)", 5 | "https://www.ipdb.org/machine.cgi?id=1794", 6 | "https://opdb.org/machines/18", 7 | "Zaccaria Generation 2" 8 | ], 9 | "_fileformat": 0.7, 10 | "_metadata": { 11 | "version": 1, 12 | "copyright": [ 13 | "Copyright (C) 2024 by Francis De Brabandere ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "zaccaria-gen2", 18 | "roms": [ 19 | "pinchamp" 20 | ] 21 | }, 22 | "game_state": { 23 | "credits": { 24 | "label": "Credits", 25 | "start": "0x1D8B", 26 | "length": 2, 27 | "encoding": "bcd" 28 | }, 29 | "scores": [ 30 | { 31 | "label": "Player 1", 32 | "start": "0x1CC0", 33 | "encoding": "bcd", 34 | "length": 8 35 | }, 36 | { 37 | "label": "Player 2", 38 | "start": "0x1CC8", 39 | "encoding": "bcd", 40 | "length": 8 41 | }, 42 | { 43 | "label": "Player 3", 44 | "start": "0x1CD0", 45 | "encoding": "bcd", 46 | "length": 8 47 | }, 48 | { 49 | "label": "Player 4", 50 | "start": "0x1CD8", 51 | "encoding": "bcd", 52 | "length": 8 53 | } 54 | ] 55 | }, 56 | "high_scores": [ 57 | { 58 | "label": "High Score", 59 | "short_label": "HS", 60 | "score": { 61 | "start": "0x1F44", 62 | "encoding": "bcd", 63 | "length": 8 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /maps/zaccaria/gen1/hod.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "House of Diamonds (Zaccaria 1978)", 5 | "https://www.ipdb.org/machine.cgi?id=3165", 6 | "https://opdb.org/machines/559", 7 | "Zaccaria Generation 1", 8 | "Same layout as strapids" 9 | ], 10 | "_fileformat": 0.7, 11 | "_metadata": { 12 | "version": 1, 13 | "copyright": [ 14 | "Copyright (C) 2024 by Francis De Brabandere ", 15 | "Copyright (C) 2025 by Tom Collins " 16 | ], 17 | "license": "GNU Lesser General Public License v3.0", 18 | "platform": "zaccaria-gen1", 19 | "roms": [ 20 | "hod" 21 | ] 22 | }, 23 | "game_state": { 24 | "credits": { 25 | "label": "Credits", 26 | "start": "0x182C", 27 | "length": 2, 28 | "encoding": "bcd" 29 | }, 30 | "scores": [ 31 | { 32 | "label": "Player 1", 33 | "start": "0x1800", 34 | "encoding": "bcd", 35 | "length": 6 36 | }, 37 | { 38 | "label": "Player 2", 39 | "start": "0x1808", 40 | "encoding": "bcd", 41 | "length": 6 42 | }, 43 | { 44 | "label": "Player 3", 45 | "start": "0x1810", 46 | "encoding": "bcd", 47 | "length": 6 48 | }, 49 | { 50 | "label": "Player 4", 51 | "start": "0x1818", 52 | "encoding": "bcd", 53 | "length": 6 54 | } 55 | ] 56 | }, 57 | "high_scores": [ 58 | { 59 | "label": "High Score", 60 | "short_label": "HS", 61 | "score": { 62 | "start": "0x1820", 63 | "encoding": "bcd", 64 | "length": 6 65 | } 66 | } 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /maps/zaccaria/gen2/dvlrider.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Devil Riders (Zaccaria 1984)", 5 | "https://www.ipdb.org/machine.cgi?id=672", 6 | "https://opdb.org/machines/950", 7 | "Zaccaria Generation 2", 8 | "Same memory layout as farfalla" 9 | ], 10 | "_fileformat": 0.7, 11 | "_metadata": { 12 | "version": 1, 13 | "copyright": [ 14 | "Copyright (C) 2024 by Francis De Brabandere ", 15 | "Copyright (C) 2025 by Tom Collins " 16 | ], 17 | "license": "GNU Lesser General Public License v3.0", 18 | "platform": "zaccaria-gen2", 19 | "roms": [ 20 | "dvlrider" 21 | ] 22 | }, 23 | "game_state": { 24 | "credits": { 25 | "label": "Credits", 26 | "start": "0x1D9C", 27 | "length": 2, 28 | "encoding": "bcd" 29 | }, 30 | "scores": [ 31 | { 32 | "label": "Player 1", 33 | "start": "0x1CC0", 34 | "encoding": "bcd", 35 | "length": 7 36 | }, 37 | { 38 | "label": "Player 2", 39 | "start": "0x1CC8", 40 | "encoding": "bcd", 41 | "length": 7 42 | }, 43 | { 44 | "label": "Player 3", 45 | "start": "0x1CD0", 46 | "encoding": "bcd", 47 | "length": 7 48 | }, 49 | { 50 | "label": "Player 4", 51 | "start": "0x1CD8", 52 | "encoding": "bcd", 53 | "length": 7 54 | } 55 | ] 56 | }, 57 | "high_scores": [ 58 | { 59 | "label": "High Score", 60 | "short_label": "HS", 61 | "score": { 62 | "start": "0x1F44", 63 | "encoding": "bcd", 64 | "length": 7 65 | } 66 | } 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /maps/zaccaria/gen1/stargoda.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Star God (Zaccaria 1980)", 5 | "https://www.ipdb.org/machine.cgi?id=3458", 6 | "https://opdb.org/machines/1555", 7 | "Zaccaria Generation 1", 8 | "The rom defaults to the following settings:", 9 | " - Easier game with the 'GOD' advancement starting with 'GO' when first top drop target bank is dropped", 10 | " - Random high score which gives a replay when achieved", 11 | " - High score does not save", 12 | "Same layout as strapids" 13 | ], 14 | "_fileformat": 0.7, 15 | "_metadata": { 16 | "version": 1, 17 | "copyright": [ 18 | "Copyright (C) 2024 by Francis De Brabandere ", 19 | "Copyright (C) 2025 by Tom Collins " 20 | ], 21 | "license": "GNU Lesser General Public License v3.0", 22 | "platform": "zaccaria-gen1", 23 | "roms": [ 24 | "stargoda" 25 | ] 26 | }, 27 | "game_state": { 28 | "credits": { 29 | "label": "Credits", 30 | "start": "0x182C", 31 | "length": 2, 32 | "encoding": "bcd" 33 | }, 34 | "scores": [ 35 | { 36 | "label": "Player 1", 37 | "start": "0x1800", 38 | "encoding": "bcd", 39 | "length": 6 40 | }, 41 | { 42 | "label": "Player 2", 43 | "start": "0x1808", 44 | "encoding": "bcd", 45 | "length": 6 46 | }, 47 | { 48 | "label": "Player 3", 49 | "start": "0x1810", 50 | "encoding": "bcd", 51 | "length": 6 52 | }, 53 | { 54 | "label": "Player 4", 55 | "start": "0x1818", 56 | "encoding": "bcd", 57 | "length": 6 58 | } 59 | ] 60 | }, 61 | "high_scores": [ 62 | { 63 | "label": "High Score", 64 | "short_label": "HS", 65 | "score": { 66 | "start": "0x1820", 67 | "encoding": "bcd", 68 | "length": 6 69 | } 70 | } 71 | ] 72 | } 73 | -------------------------------------------------------------------------------- /maps/williams/system11/gmine_l2.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Gold Mine (Williams 1987)", 5 | "https://www.ipdb.org/machine.cgi?id=4935", 6 | "Williams System 11B", 7 | "Unlike other System 11 games, Gold Mine does not have checksummed Audits.", 8 | "Only System 11 game to have 16KB ROM (so we use the System 9 16K ROM platform)." 9 | ], 10 | "_fileformat": 0.7, 11 | "_metadata": { 12 | "version": 1, 13 | "copyright": [ 14 | "Copyright (C) 2024 by Francis De Brabandere ", 15 | "Copyright (C) 2025 by Tom Collins " 16 | ], 17 | "license": "GNU Lesser General Public License v3.0", 18 | "platform": "williams-system9-16K", 19 | "roms": [ 20 | "gmine_l2" 21 | ] 22 | }, 23 | "game_state": { 24 | "credits": { 25 | "label": "Credits", 26 | "start": 1752, 27 | "length": 1, 28 | "encoding": "bcd" 29 | }, 30 | "scores": [ 31 | { 32 | "label": "Player 1", 33 | "start": 56, 34 | "encoding": "bcd", 35 | "length": 2 36 | }, 37 | { 38 | "label": "Player 2", 39 | "start": 58, 40 | "encoding": "bcd", 41 | "length": 2 42 | }, 43 | { 44 | "label": "Player 3", 45 | "start": 60, 46 | "encoding": "bcd", 47 | "length": 2 48 | }, 49 | { 50 | "label": "Player 4", 51 | "start": 62, 52 | "encoding": "bcd", 53 | "length": 2 54 | }, 55 | { 56 | "label": "Player 5", 57 | "start": 64, 58 | "encoding": "bcd", 59 | "length": 2 60 | }, 61 | { 62 | "label": "Player 6", 63 | "start": 66, 64 | "encoding": "bcd", 65 | "length": 2 66 | } 67 | ] 68 | }, 69 | "high_scores": [ 70 | { 71 | "label": "High Score", 72 | "short_label": "HS", 73 | "score": { 74 | "start": 1750, 75 | "encoding": "bcd", 76 | "length": 2 77 | } 78 | } 79 | ] 80 | } 81 | -------------------------------------------------------------------------------- /maps/sega/whitestar/gldneye.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Compiled by Steven Harding", 3 | "_fileformat": 0.7, 4 | "_metadata": { 5 | "version": 1, 6 | "copyright": [ 7 | "None", 8 | "Copyright (C) 2025 by Tom Collins " 9 | ], 10 | "license": "GNU Lesser General Public License v3.0", 11 | "platform": "whitestar", 12 | "roms": [ 13 | "gldneye" 14 | ] 15 | }, 16 | "limits": { 17 | "high_score_min": "24000000" 18 | }, 19 | "high_scores": [ 20 | { 21 | "label": "First Place", 22 | "short_label": "1st", 23 | "initials": { 24 | "start": 5306, 25 | "encoding": "ch", 26 | "length": 3 27 | }, 28 | "score": { 29 | "start": 5244, 30 | "encoding": "bcd", 31 | "length": 5 32 | } 33 | }, 34 | { 35 | "label": "Second Place", 36 | "short_label": "2nd", 37 | "initials": { 38 | "start": 5309, 39 | "encoding": "ch", 40 | "length": 3 41 | }, 42 | "score": { 43 | "start": 5249, 44 | "encoding": "bcd", 45 | "length": 5 46 | } 47 | }, 48 | { 49 | "label": "Third Place", 50 | "short_label": "3rd", 51 | "initials": { 52 | "start": 5312, 53 | "encoding": "ch", 54 | "length": 3 55 | }, 56 | "score": { 57 | "start": 5254, 58 | "encoding": "bcd", 59 | "length": 5 60 | } 61 | }, 62 | { 63 | "label": "Fourth Place", 64 | "short_label": "4th", 65 | "initials": { 66 | "start": 5315, 67 | "encoding": "ch", 68 | "length": 3 69 | }, 70 | "score": { 71 | "start": 5259, 72 | "encoding": "bcd", 73 | "length": 5 74 | } 75 | }, 76 | { 77 | "label": "Fifth Place", 78 | "short_label": "5th", 79 | "initials": { 80 | "start": 5318, 81 | "encoding": "ch", 82 | "length": 3 83 | }, 84 | "score": { 85 | "start": 5264, 86 | "encoding": "bcd", 87 | "length": 5 88 | } 89 | }, 90 | { 91 | "label": "Sixth Place", 92 | "short_label": "6th", 93 | "initials": { 94 | "start": 5321, 95 | "encoding": "ch", 96 | "length": 3 97 | }, 98 | "score": { 99 | "start": 5269, 100 | "encoding": "bcd", 101 | "length": 5 102 | } 103 | } 104 | ] 105 | } 106 | -------------------------------------------------------------------------------- /tools/update-index.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import glob 4 | import json 5 | import os 6 | 7 | 8 | errors = 0 9 | index = { 10 | '_note': 'Automatically generated by tools/update-index.py', 11 | } 12 | rootdir = os.path.join(os.path.dirname(__file__), '..') 13 | names_to_maps = {} 14 | names_to_roms = {} 15 | 16 | # make sure ROMs listed in maps appear in romnames.json 17 | with open(os.path.join(rootdir, 'romnames.json')) as f: 18 | romnames = json.load(f) 19 | 20 | maps = os.path.join(rootdir, 'maps', '**', '*.map.json') 21 | for map_file in glob.glob(maps, recursive=True): 22 | with open(map_file, 'r') as f: 23 | map_json = json.load(f) 24 | metadata = map_json.get('_metadata', {}) 25 | roms = metadata.get('roms') 26 | platform = metadata.get('platform') 27 | if not roms: 28 | errors += 1 29 | print("Error: %s is missing a _metadata.roms entry" % map_file) 30 | elif not platform: 31 | errors += 1 32 | print("Error: %s is missing a _metadata.platform entry" % map_file) 33 | elif not os.path.isfile(os.path.join(rootdir, 'platforms', platform + '.json')): 34 | errors += 1 35 | print("Error: %s is missing platform file %s" % (map_file, platform)) 36 | else: 37 | for rom in roms: 38 | name = romnames.get(rom) 39 | if not name: 40 | errors += 1 41 | print("Error: %s (from %s) does not appear in romnames.json" % (rom, map_file)) 42 | if index.get(rom): 43 | errors += 1 44 | print("Error: %s appears in %s and %s" % (rom, index[rom], map_file)) 45 | path = os.path.relpath(map_file, rootdir) 46 | index[rom] = path 47 | if name in names_to_maps: 48 | print("Warning: multiple ROMs named %s" % name) 49 | names_to_maps[name] = path 50 | names_to_roms[name] = rom 51 | 52 | with open(os.path.join(rootdir, 'index.json'), 'w') as f: 53 | f.write(json.dumps(index, indent=2, sort_keys=True)) 54 | f.write('\n') # include trailing newline 55 | 56 | with open(os.path.join(rootdir, 'maplist.md'), 'w') as f: 57 | map_paths = [] 58 | for name, path in sorted(names_to_maps.items()): 59 | if path not in map_paths: 60 | map_paths.append(path) 61 | f.write('* [%s][%u] _%s_\n' % (name, map_paths.index(path) + 1, names_to_roms.get(name))) 62 | f.write('\n') 63 | for index, path in enumerate(map_paths): 64 | f.write('[%u]: %s\n' % (index + 1, path)) 65 | 66 | exit(errors) 67 | -------------------------------------------------------------------------------- /maps/sega/whitestar/jplstw22.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by HorsePin" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C) 2022 https://github.com/horseyhorsey", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "whitestar", 14 | "roms": [ 15 | "jplstw22" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "bcd", 23 | "length": 5, 24 | "start": 5350 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "bcd", 29 | "length": 5, 30 | "start": 5355 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "bcd", 35 | "length": 5, 36 | "start": 5360 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "bcd", 41 | "length": 5, 42 | "start": 5365 43 | } 44 | ] 45 | }, 46 | "high_scores": [ 47 | { 48 | "label": "#1", 49 | "short_label": "#1", 50 | "initials": { 51 | "start": 5326, 52 | "encoding": "ch", 53 | "length": 3 54 | }, 55 | "score": { 56 | "encoding": "bcd", 57 | "length": 5, 58 | "start": 5265 59 | } 60 | }, 61 | { 62 | "label": "#2", 63 | "short_label": "#2", 64 | "initials": { 65 | "start": 5329, 66 | "encoding": "ch", 67 | "length": 3 68 | }, 69 | "score": { 70 | "encoding": "bcd", 71 | "length": 5, 72 | "start": 5270 73 | } 74 | }, 75 | { 76 | "label": "#3", 77 | "short_label": "#3", 78 | "initials": { 79 | "start": 5332, 80 | "encoding": "ch", 81 | "length": 3 82 | }, 83 | "score": { 84 | "encoding": "bcd", 85 | "length": 5, 86 | "start": 5275 87 | } 88 | }, 89 | { 90 | "label": "#4", 91 | "short_label": "#4", 92 | "initials": { 93 | "start": 5335, 94 | "encoding": "ch", 95 | "length": 3 96 | }, 97 | "score": { 98 | "encoding": "bcd", 99 | "length": 5, 100 | "start": 5280 101 | } 102 | }, 103 | { 104 | "label": "#5", 105 | "short_label": "#5", 106 | "initials": { 107 | "start": 5338, 108 | "encoding": "ch", 109 | "length": 3 110 | }, 111 | "score": { 112 | "encoding": "bcd", 113 | "length": 5, 114 | "start": 5285 115 | } 116 | }, 117 | { 118 | "label": "#6", 119 | "short_label": "#6", 120 | "initials": { 121 | "start": 5341, 122 | "encoding": "ch", 123 | "length": 3 124 | }, 125 | "score": { 126 | "encoding": "bcd", 127 | "length": 5, 128 | "start": 5290 129 | } 130 | } 131 | ] 132 | } 133 | -------------------------------------------------------------------------------- /maps/williams/wpc/dm_dt101.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Compiled by Tom Collins for initial development/testing purposes.", 3 | "_fileformat": 0.7, 4 | "_metadata": { 5 | "version": 1, 6 | "copyright": [ 7 | "Copyright (C) 2020 by Tom Collins ", 8 | "Copyright (C) 2025 by Tom Collins " 9 | ], 10 | "license": "GNU Lesser General Public License v3.0", 11 | "platform": "williams-wpc-12K", 12 | "roms": [ 13 | "dm_dt101" 14 | ] 15 | }, 16 | "game_state": { 17 | "scores": [ 18 | { 19 | "label": "Player 1", 20 | "start": 5639, 21 | "encoding": "bcd", 22 | "length": 5 23 | }, 24 | { 25 | "label": "Player 2", 26 | "start": 5644, 27 | "encoding": "bcd", 28 | "length": 5 29 | }, 30 | { 31 | "label": "Player 3", 32 | "start": 5649, 33 | "encoding": "bcd", 34 | "length": 5 35 | }, 36 | { 37 | "label": "Player 4", 38 | "start": 5654, 39 | "encoding": "bcd", 40 | "length": 5 41 | } 42 | ] 43 | }, 44 | "last_played": { 45 | "start": 6144, 46 | "encoding": "wpc_rtc", 47 | "length": 7 48 | }, 49 | "high_scores": [ 50 | { 51 | "label": "Grand Champion", 52 | "short_label": "GC", 53 | "initials": { 54 | "start": 6494, 55 | "encoding": "ch", 56 | "length": 3 57 | }, 58 | "score": { 59 | "start": 6489, 60 | "encoding": "bcd", 61 | "length": 5 62 | } 63 | }, 64 | { 65 | "label": "First Place", 66 | "short_label": "1st", 67 | "initials": { 68 | "start": 6502, 69 | "encoding": "ch", 70 | "length": 3 71 | }, 72 | "score": { 73 | "start": 6497, 74 | "encoding": "bcd", 75 | "length": 5 76 | } 77 | }, 78 | { 79 | "label": "Second Place", 80 | "short_label": "2nd", 81 | "initials": { 82 | "start": 6510, 83 | "encoding": "ch", 84 | "length": 3 85 | }, 86 | "score": { 87 | "start": 6505, 88 | "encoding": "bcd", 89 | "length": 5 90 | } 91 | }, 92 | { 93 | "label": "Third Place", 94 | "short_label": "3rd", 95 | "initials": { 96 | "start": 6518, 97 | "encoding": "ch", 98 | "length": 3 99 | }, 100 | "score": { 101 | "start": 6513, 102 | "encoding": "bcd", 103 | "length": 5 104 | } 105 | }, 106 | { 107 | "label": "Fourth Place", 108 | "short_label": "4th", 109 | "initials": { 110 | "start": 6526, 111 | "encoding": "ch", 112 | "length": 3 113 | }, 114 | "score": { 115 | "start": 6521, 116 | "encoding": "bcd", 117 | "length": 5 118 | } 119 | }, 120 | { 121 | "label": "Fifth Place", 122 | "short_label": "5th", 123 | "initials": { 124 | "start": 6534, 125 | "encoding": "ch", 126 | "default": "\u00ff\u00ff\u00ff", 127 | "length": 3 128 | }, 129 | "score": { 130 | "start": 6529, 131 | "encoding": "bcd", 132 | "length": 5 133 | } 134 | } 135 | ] 136 | } 137 | -------------------------------------------------------------------------------- /maps/sega/whitestar/swtril43.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by HorsePin" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C) 2022 by HorsePin", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "whitestar", 14 | "roms": [ 15 | "swtril43" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "bcd", 23 | "length": 4, 24 | "start": 5351 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "bcd", 29 | "length": 4, 30 | "start": 5356 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "bcd", 35 | "length": 4, 36 | "start": 5361 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "bcd", 41 | "length": 4, 42 | "start": 5366 43 | }, 44 | { 45 | "label": "Player 5", 46 | "encoding": "bcd", 47 | "length": 4, 48 | "start": 5371 49 | }, 50 | { 51 | "label": "Player 6", 52 | "encoding": "bcd", 53 | "length": 4, 54 | "start": 5376 55 | } 56 | ] 57 | }, 58 | "high_scores": [ 59 | { 60 | "label": "#1 Jedi", 61 | "short_label": "#1", 62 | "initials": { 63 | "start": 5430, 64 | "encoding": "ch", 65 | "length": 3 66 | }, 67 | "score": { 68 | "encoding": "bcd", 69 | "length": 4, 70 | "start": 7712 71 | } 72 | }, 73 | { 74 | "label": "#2 Jedi", 75 | "short_label": "#2", 76 | "initials": { 77 | "start": 5329, 78 | "encoding": "ch", 79 | "length": 3 80 | }, 81 | "score": { 82 | "encoding": "bcd", 83 | "length": 4, 84 | "start": 8036 85 | } 86 | }, 87 | { 88 | "label": "#3 Jedi", 89 | "short_label": "#3", 90 | "initials": { 91 | "start": 5332, 92 | "encoding": "ch", 93 | "length": 3 94 | }, 95 | "score": { 96 | "encoding": "bcd", 97 | "length": 4, 98 | "start": 7722 99 | } 100 | }, 101 | { 102 | "label": "#4 Jedi", 103 | "short_label": "#4", 104 | "initials": { 105 | "start": 5335, 106 | "encoding": "ch", 107 | "length": 3 108 | }, 109 | "score": { 110 | "encoding": "bcd", 111 | "length": 4, 112 | "start": 7727 113 | } 114 | }, 115 | { 116 | "label": "#5 Jedi", 117 | "short_label": "#5", 118 | "initials": { 119 | "start": 5338, 120 | "encoding": "ch", 121 | "length": 3 122 | }, 123 | "score": { 124 | "encoding": "bcd", 125 | "length": 4, 126 | "start": 7732 127 | } 128 | }, 129 | { 130 | "label": "#6 Jedi", 131 | "short_label": "#6", 132 | "initials": { 133 | "start": 5341, 134 | "encoding": "ch", 135 | "length": 3 136 | }, 137 | "score": { 138 | "encoding": "bcd", 139 | "length": 4, 140 | "start": 7737 141 | } 142 | } 143 | ] 144 | } 145 | -------------------------------------------------------------------------------- /maps/sega/whitestar/sprk_103.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": "Compiled by Steven Harding.", 3 | "_fileformat": 0.7, 4 | "_metadata": { 5 | "version": 1, 6 | "copyright": [ 7 | "None", 8 | "Copyright (C) 2025 by Tom Collins " 9 | ], 10 | "license": "GNU Lesser General Public License v3.0", 11 | "platform": "whitestar", 12 | "roms": [ 13 | "sprk_103" 14 | ] 15 | }, 16 | "limits": { 17 | "high_score_min": "400000000" 18 | }, 19 | "high_scores": [ 20 | { 21 | "label": "First Place", 22 | "short_label": "1st", 23 | "initials": { 24 | "start": 5346, 25 | "encoding": "ch", 26 | "length": 3 27 | }, 28 | "score": { 29 | "start": 5264, 30 | "encoding": "bcd", 31 | "length": 5 32 | } 33 | }, 34 | { 35 | "label": "Second Place", 36 | "short_label": "2nd", 37 | "initials": { 38 | "start": 5356, 39 | "encoding": "ch", 40 | "length": 3 41 | }, 42 | "score": { 43 | "start": 5269, 44 | "encoding": "bcd", 45 | "length": 5 46 | } 47 | }, 48 | { 49 | "label": "Third Place", 50 | "short_label": "3rd", 51 | "initials": { 52 | "start": 5366, 53 | "encoding": "ch", 54 | "length": 3 55 | }, 56 | "score": { 57 | "start": 5274, 58 | "encoding": "bcd", 59 | "length": 5 60 | } 61 | }, 62 | { 63 | "label": "Fourth Place", 64 | "short_label": "4th", 65 | "initials": { 66 | "start": 5376, 67 | "encoding": "ch", 68 | "length": 3 69 | }, 70 | "score": { 71 | "start": 5279, 72 | "encoding": "bcd", 73 | "length": 5 74 | } 75 | }, 76 | { 77 | "label": "Fifth Place", 78 | "short_label": "5th", 79 | "initials": { 80 | "start": 5386, 81 | "encoding": "ch", 82 | "length": 3 83 | }, 84 | "score": { 85 | "start": 5284, 86 | "encoding": "bcd", 87 | "length": 5 88 | } 89 | }, 90 | { 91 | "label": "Sixth Place", 92 | "short_label": "6th", 93 | "initials": { 94 | "start": 5396, 95 | "encoding": "ch", 96 | "length": 3 97 | }, 98 | "score": { 99 | "start": 5289, 100 | "encoding": "bcd", 101 | "length": 5 102 | } 103 | }, 104 | { 105 | "label": "Seventh Place", 106 | "short_label": "7th", 107 | "initials": { 108 | "start": 5406, 109 | "encoding": "ch", 110 | "length": 3 111 | }, 112 | "score": { 113 | "start": 5294, 114 | "encoding": "bcd", 115 | "length": 5 116 | } 117 | }, 118 | { 119 | "label": "Eighth Place", 120 | "short_label": "8th", 121 | "initials": { 122 | "start": 5416, 123 | "encoding": "ch", 124 | "length": 3 125 | }, 126 | "score": { 127 | "start": 5299, 128 | "encoding": "bcd", 129 | "length": 5 130 | } 131 | }, 132 | { 133 | "label": "Ninth Place", 134 | "short_label": "9th", 135 | "initials": { 136 | "start": 5426, 137 | "encoding": "ch", 138 | "length": 3 139 | }, 140 | "score": { 141 | "start": 5304, 142 | "encoding": "bcd", 143 | "length": 5 144 | } 145 | }, 146 | { 147 | "label": "Tenth Place", 148 | "short_label": "10th", 149 | "initials": { 150 | "start": 5436, 151 | "encoding": "ch", 152 | "length": 3 153 | }, 154 | "score": { 155 | "start": 5309, 156 | "encoding": "bcd", 157 | "length": 5 158 | } 159 | } 160 | ] 161 | } 162 | -------------------------------------------------------------------------------- /maps/dataeast/version1/lwar_a83.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "2025-11: initial map created by Tom Collins, based on DE Version 2 maps." 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 3, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "dataeast-v1", 13 | "roms": [ 14 | "lwar_a81", 15 | "lwar_a83", 16 | "lwar_e90" 17 | ] 18 | }, 19 | "game_state": { 20 | "scores": [ 21 | { 22 | "label": "Player 1", 23 | "start": "0x580", 24 | "encoding": "bcd", 25 | "length": 4, 26 | "scale": 10 27 | }, 28 | { 29 | "label": "Player 2", 30 | "start": "0x5A0", 31 | "encoding": "bcd", 32 | "length": 4, 33 | "scale": 10 34 | }, 35 | { 36 | "label": "Player 3", 37 | "start": "0x5C0", 38 | "encoding": "bcd", 39 | "length": 4, 40 | "scale": 10 41 | }, 42 | { 43 | "label": "Player 4", 44 | "start": "0x5E0", 45 | "encoding": "bcd", 46 | "length": 4, 47 | "scale": 10 48 | } 49 | ], 50 | "credits": { 51 | "label": "Credits", 52 | "start": "0xCD", 53 | "encoding": "bcd" 54 | }, 55 | "max_credits": { 56 | "label": "Maximum Credits", 57 | "start": "0x797", 58 | "encoding": "bcd" 59 | }, 60 | "free_play": { 61 | "label": "Free Play", 62 | "start": "0x78D", 63 | "encoding": "bool" 64 | }, 65 | "current_player": { 66 | "label": "Current Player", 67 | "start": "0x649", 68 | "encoding": "int" 69 | }, 70 | "player_count": { 71 | "label": "Player Count", 72 | "start": "0x64A", 73 | "mask": "0x7F", 74 | "encoding": "int" 75 | }, 76 | "current_ball": { 77 | "label": "Current Ball", 78 | "start": "0xC9", 79 | "encoding": "int" 80 | }, 81 | "ball_count": { 82 | "label": "Ball Count", 83 | "start": "0x794", 84 | "encoding": "int" 85 | }, 86 | "game_over": { 87 | "_notes": "bit 0x80 of player_count == 0x80", 88 | "label": "Game Over", 89 | "start": "0x64A", 90 | "mask": "0x80", 91 | "encoding": "bool" 92 | } 93 | }, 94 | "high_scores": [ 95 | { 96 | "label": "1st Place", 97 | "short_label": "1st", 98 | "initials": { 99 | "start": "0x6A4", 100 | "encoding": "ch", 101 | "length": 3 102 | }, 103 | "score": { 104 | "start": "0x6A0", 105 | "encoding": "bcd", 106 | "length": 4, 107 | "scale": 10 108 | } 109 | }, 110 | { 111 | "label": "2nd Place", 112 | "short_label": "2nd", 113 | "initials": { 114 | "start": "0x6AB", 115 | "encoding": "ch", 116 | "length": 3 117 | }, 118 | "score": { 119 | "start": "0x6A7", 120 | "encoding": "bcd", 121 | "length": 4, 122 | "scale": 10 123 | } 124 | }, 125 | { 126 | "label": "3rd Place", 127 | "short_label": "3rd", 128 | "initials": { 129 | "start": "0x6B2", 130 | "encoding": "ch", 131 | "length": 3 132 | }, 133 | "score": { 134 | "start": "0x6AE", 135 | "encoding": "bcd", 136 | "length": 4, 137 | "scale": 10 138 | } 139 | }, 140 | { 141 | "label": "4th Place", 142 | "short_label": "4th", 143 | "initials": { 144 | "start": "0x6B9", 145 | "encoding": "ch", 146 | "length": 3 147 | }, 148 | "score": { 149 | "start": "0x6B5", 150 | "encoding": "bcd", 151 | "length": 4, 152 | "scale": 10 153 | } 154 | } 155 | ] 156 | } 157 | -------------------------------------------------------------------------------- /maps/dataeast/version2/poto_a32.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "2025-11: initial map created by Tom Collins, mnfb_c27 w/o mode_champions." 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 3, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "dataeast", 13 | "roms": [ 14 | "poto_a32", 15 | "poto_a31", 16 | "poto_a29" 17 | ] 18 | }, 19 | "game_state": { 20 | "scores": [ 21 | { 22 | "label": "Player 1", 23 | "start": "0x580", 24 | "encoding": "bcd", 25 | "length": 4, 26 | "scale": 10 27 | }, 28 | { 29 | "label": "Player 2", 30 | "start": "0x5A0", 31 | "encoding": "bcd", 32 | "length": 4, 33 | "scale": 10 34 | }, 35 | { 36 | "label": "Player 3", 37 | "start": "0x5C0", 38 | "encoding": "bcd", 39 | "length": 4, 40 | "scale": 10 41 | }, 42 | { 43 | "label": "Player 4", 44 | "start": "0x5E0", 45 | "encoding": "bcd", 46 | "length": 4, 47 | "scale": 10 48 | } 49 | ], 50 | "credits": { 51 | "label": "Credits", 52 | "start": "0xCD", 53 | "encoding": "bcd" 54 | }, 55 | "max_credits": { 56 | "label": "Maximum Credits", 57 | "start": "0x1F97", 58 | "encoding": "bcd" 59 | }, 60 | "free_play": { 61 | "label": "Free Play", 62 | "start": "0x1F8D", 63 | "encoding": "bool" 64 | }, 65 | "current_player": { 66 | "label": "Current Player", 67 | "start": "0x649", 68 | "encoding": "int" 69 | }, 70 | "player_count": { 71 | "label": "Player Count", 72 | "start": "0x64A", 73 | "mask": "0x7F", 74 | "encoding": "int" 75 | }, 76 | "current_ball": { 77 | "label": "Current Ball", 78 | "start": "0xED", 79 | "encoding": "int" 80 | }, 81 | "ball_count": { 82 | "label": "Ball Count", 83 | "start": "0x1F94", 84 | "encoding": "int" 85 | }, 86 | "game_over": { 87 | "_notes": "bit 0x80 of player_count == 0x80, or curr_ball == 0?", 88 | "label": "Game Over", 89 | "start": "0x64A", 90 | "mask": "0x80", 91 | "encoding": "bool" 92 | } 93 | }, 94 | "high_scores": [ 95 | { 96 | "label": "1st Place", 97 | "short_label": "1st", 98 | "initials": { 99 | "start": "0x6A4", 100 | "encoding": "ch", 101 | "length": 3 102 | }, 103 | "score": { 104 | "start": "0x6A0", 105 | "encoding": "bcd", 106 | "length": 4, 107 | "scale": 10 108 | } 109 | }, 110 | { 111 | "label": "2nd Place", 112 | "short_label": "2nd", 113 | "initials": { 114 | "start": "0x6AB", 115 | "encoding": "ch", 116 | "length": 3 117 | }, 118 | "score": { 119 | "start": "0x6A7", 120 | "encoding": "bcd", 121 | "length": 4, 122 | "scale": 10 123 | } 124 | }, 125 | { 126 | "label": "3rd Place", 127 | "short_label": "3rd", 128 | "initials": { 129 | "start": "0x6B2", 130 | "encoding": "ch", 131 | "length": 3 132 | }, 133 | "score": { 134 | "start": "0x6AE", 135 | "encoding": "bcd", 136 | "length": 4, 137 | "scale": 10 138 | } 139 | }, 140 | { 141 | "label": "4th Place", 142 | "short_label": "4th", 143 | "initials": { 144 | "start": "0x6B9", 145 | "encoding": "ch", 146 | "length": 3 147 | }, 148 | "score": { 149 | "start": "0x6B5", 150 | "encoding": "bcd", 151 | "length": 4, 152 | "scale": 10 153 | } 154 | } 155 | ] 156 | } 157 | -------------------------------------------------------------------------------- /maps/stern/whitestar/rip300.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on Sopranos." 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 2, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "whitestar", 13 | "roms": [ 14 | "rip300", 15 | "rip300f", 16 | "rip300g", 17 | "rip300i", 18 | "rip300l" 19 | ] 20 | }, 21 | "game_state": { 22 | "scores": [ 23 | { 24 | "label": "Player 1", 25 | "start": "0x1656", 26 | "length": 5, 27 | "encoding": "bcd" 28 | }, 29 | { 30 | "label": "Player 2", 31 | "start": "0x165B", 32 | "length": 5, 33 | "encoding": "bcd" 34 | }, 35 | { 36 | "label": "Player 3", 37 | "start": "0x1660", 38 | "length": 5, 39 | "encoding": "bcd" 40 | }, 41 | { 42 | "label": "Player 4", 43 | "start": "0x1665", 44 | "length": 5, 45 | "encoding": "bcd" 46 | } 47 | ], 48 | "credits": { 49 | "label": "Credits", 50 | "start": "0x164F", 51 | "encoding": "bcd" 52 | }, 53 | "max_credits": { 54 | "label": "Max Credits", 55 | "start": "0x1E0F", 56 | "encoding": "bcd" 57 | }, 58 | "free_play": { 59 | "label": "Free Play", 60 | "start": "0x1E05", 61 | "encoding": "bool" 62 | }, 63 | "tilted": { 64 | "label": "Tilted", 65 | "start": "0x322", 66 | "encoding": "bool" 67 | }, 68 | "current_player": { 69 | "label": "Current Player", 70 | "start": "0x324", 71 | "encoding": "bcd" 72 | }, 73 | "current_ball": { 74 | "label": "Current Ball", 75 | "start": "0x325", 76 | "encoding": "bcd" 77 | }, 78 | "player_count": { 79 | "label": "Player Count", 80 | "start": "0x326", 81 | "encoding": "bcd" 82 | }, 83 | "ball_count": { 84 | "label": "Ball Count", 85 | "start": "0x1E0D", 86 | "encoding": "bcd" 87 | }, 88 | "game_over": { 89 | "_notes": "current_player == 0", 90 | "label": "Game Over", 91 | "start": "0x324", 92 | "encoding": "bool", 93 | "invert": true 94 | } 95 | }, 96 | "high_scores": [ 97 | { 98 | "label": "Grand Champ", 99 | "short_label": "GC", 100 | "initials": { 101 | "start": "0x161D", 102 | "encoding": "ch", 103 | "length": 10 104 | }, 105 | "score": { 106 | "start": "0x15DC", 107 | "encoding": "bcd", 108 | "length": 5 109 | } 110 | }, 111 | { 112 | "label": "#1", 113 | "initials": { 114 | "start": "0x1627", 115 | "encoding": "ch", 116 | "length": 10 117 | }, 118 | "score": { 119 | "start": "0x15E1", 120 | "encoding": "bcd", 121 | "length": 5 122 | } 123 | }, 124 | { 125 | "label": "#2", 126 | "initials": { 127 | "start": "0x1631", 128 | "encoding": "ch", 129 | "length": 10 130 | }, 131 | "score": { 132 | "start": "0x15E6", 133 | "encoding": "bcd", 134 | "length": 5 135 | } 136 | }, 137 | { 138 | "label": "#3", 139 | "initials": { 140 | "start": "0x163B", 141 | "encoding": "ch", 142 | "length": 10 143 | }, 144 | "score": { 145 | "start": "0x15EB", 146 | "encoding": "bcd", 147 | "length": 5 148 | } 149 | }, 150 | { 151 | "label": "#4", 152 | "initials": { 153 | "start": "0x1645", 154 | "encoding": "ch", 155 | "length": 10 156 | }, 157 | "score": { 158 | "start": "0x15F0", 159 | "encoding": "bcd", 160 | "length": 5 161 | } 162 | } 163 | ] 164 | } 165 | -------------------------------------------------------------------------------- /maps/dataeast/version2/generic.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "2025-11: initial map created by Tom Collins, same as Playboy (w/o mode_champions)." 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 3, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "dataeast", 13 | "roms": [ 14 | "ssvc_a26", 15 | "ssvc_b26", 16 | "ssvc_a42", 17 | "ssvc_e40", 18 | "tmac_a24", 19 | "tmac_a18", 20 | "tmac_g18", 21 | "torp_e21", 22 | "torp_a16" 23 | ] 24 | }, 25 | "game_state": { 26 | "scores": [ 27 | { 28 | "label": "Player 1", 29 | "start": "0x580", 30 | "encoding": "bcd", 31 | "length": 4, 32 | "scale": 10 33 | }, 34 | { 35 | "label": "Player 2", 36 | "start": "0x5A0", 37 | "encoding": "bcd", 38 | "length": 4, 39 | "scale": 10 40 | }, 41 | { 42 | "label": "Player 3", 43 | "start": "0x5C0", 44 | "encoding": "bcd", 45 | "length": 4, 46 | "scale": 10 47 | }, 48 | { 49 | "label": "Player 4", 50 | "start": "0x5E0", 51 | "encoding": "bcd", 52 | "length": 4, 53 | "scale": 10 54 | } 55 | ], 56 | "credits": { 57 | "label": "Credits", 58 | "start": "0xCD", 59 | "encoding": "bcd" 60 | }, 61 | "max_credits": { 62 | "label": "Maximum Credits", 63 | "start": "0x1F97", 64 | "encoding": "bcd" 65 | }, 66 | "free_play": { 67 | "label": "Free Play", 68 | "start": "0x1F8D", 69 | "encoding": "bool" 70 | }, 71 | "current_player": { 72 | "label": "Current Player", 73 | "start": "0x649", 74 | "encoding": "int" 75 | }, 76 | "player_count": { 77 | "label": "Player Count", 78 | "start": "0x64A", 79 | "mask": "0x7F", 80 | "encoding": "int" 81 | }, 82 | "current_ball": { 83 | "label": "Current Ball", 84 | "start": "0xC9", 85 | "encoding": "int" 86 | }, 87 | "ball_count": { 88 | "label": "Ball Count", 89 | "start": "0x1F94", 90 | "encoding": "int" 91 | }, 92 | "game_over": { 93 | "_notes": "bit 0x80 of player_count == 0x80", 94 | "label": "Game Over", 95 | "start": "0x64A", 96 | "mask": "0x80", 97 | "encoding": "bool" 98 | } 99 | }, 100 | "high_scores": [ 101 | { 102 | "label": "1st Place", 103 | "short_label": "1st", 104 | "initials": { 105 | "start": "0x6A4", 106 | "encoding": "ch", 107 | "length": 3 108 | }, 109 | "score": { 110 | "start": "0x6A0", 111 | "encoding": "bcd", 112 | "length": 4, 113 | "scale": 10 114 | } 115 | }, 116 | { 117 | "label": "2nd Place", 118 | "short_label": "2nd", 119 | "initials": { 120 | "start": "0x6AB", 121 | "encoding": "ch", 122 | "length": 3 123 | }, 124 | "score": { 125 | "start": "0x6A7", 126 | "encoding": "bcd", 127 | "length": 4, 128 | "scale": 10 129 | } 130 | }, 131 | { 132 | "label": "3rd Place", 133 | "short_label": "3rd", 134 | "initials": { 135 | "start": "0x6B2", 136 | "encoding": "ch", 137 | "length": 3 138 | }, 139 | "score": { 140 | "start": "0x6AE", 141 | "encoding": "bcd", 142 | "length": 4, 143 | "scale": 10 144 | } 145 | }, 146 | { 147 | "label": "4th Place", 148 | "short_label": "4th", 149 | "initials": { 150 | "start": "0x6B9", 151 | "encoding": "ch", 152 | "length": 3 153 | }, 154 | "score": { 155 | "start": "0x6B5", 156 | "encoding": "bcd", 157 | "length": 4, 158 | "scale": 10 159 | } 160 | } 161 | ] 162 | } 163 | -------------------------------------------------------------------------------- /maps/stern/whitestar/simpprty.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on strikext.", 4 | "Same CPU ROM for simpprty, simpprtg, simpprtl, simpprtf, and simpprti." 5 | ], 6 | "_fileformat": 0.8, 7 | "_metadata": { 8 | "version": 1, 9 | "copyright": [ 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "whitestar", 14 | "roms": [ 15 | "simpprty", 16 | "simpprtg", 17 | "simpprtl", 18 | "simpprtf", 19 | "simpprti" 20 | ] 21 | }, 22 | "game_state": { 23 | "scores": [ 24 | { 25 | "label": "Player 1", 26 | "start": "0x1656", 27 | "length": 5, 28 | "encoding": "bcd" 29 | }, 30 | { 31 | "label": "Player 2", 32 | "start": "0x165B", 33 | "length": 5, 34 | "encoding": "bcd" 35 | }, 36 | { 37 | "label": "Player 3", 38 | "start": "0x1660", 39 | "length": 5, 40 | "encoding": "bcd" 41 | }, 42 | { 43 | "label": "Player 4", 44 | "start": "0x1665", 45 | "length": 5, 46 | "encoding": "bcd" 47 | } 48 | ], 49 | "credits": { 50 | "label": "Credits", 51 | "start": "0x164F", 52 | "encoding": "bcd" 53 | }, 54 | "max_credits": { 55 | "label": "Max Credits", 56 | "start": "0x1E0F", 57 | "encoding": "bcd" 58 | }, 59 | "free_play": { 60 | "label": "Free Play", 61 | "start": "0x1E05", 62 | "encoding": "bool" 63 | }, 64 | "tilted": { 65 | "label": "Tilted", 66 | "start": "0x307", 67 | "encoding": "bool" 68 | }, 69 | "current_player": { 70 | "label": "Current Player", 71 | "start": "0x309", 72 | "encoding": "bcd" 73 | }, 74 | "current_ball": { 75 | "label": "Current Ball", 76 | "start": "0x30A", 77 | "encoding": "bcd" 78 | }, 79 | "player_count": { 80 | "label": "Player Count", 81 | "start": "0x30B", 82 | "encoding": "bcd" 83 | }, 84 | "ball_count": { 85 | "label": "Ball Count", 86 | "start": "0x1E0D", 87 | "encoding": "bcd" 88 | }, 89 | "game_over": { 90 | "_notes": "current_player == 0", 91 | "label": "Game Over", 92 | "start": "0x309", 93 | "encoding": "bool", 94 | "invert": true 95 | } 96 | }, 97 | "high_scores": [ 98 | { 99 | "label": "Grand Champ", 100 | "short_label": "GC", 101 | "initials": { 102 | "start": "0x161D", 103 | "encoding": "ch", 104 | "length": 10 105 | }, 106 | "score": { 107 | "start": "0x15DC", 108 | "encoding": "bcd", 109 | "length": 5 110 | } 111 | }, 112 | { 113 | "label": "#1", 114 | "initials": { 115 | "start": "0x1627", 116 | "encoding": "ch", 117 | "length": 10 118 | }, 119 | "score": { 120 | "start": "0x15E1", 121 | "encoding": "bcd", 122 | "length": 5 123 | } 124 | }, 125 | { 126 | "label": "#2", 127 | "initials": { 128 | "start": "0x1631", 129 | "encoding": "ch", 130 | "length": 10 131 | }, 132 | "score": { 133 | "start": "0x15E6", 134 | "encoding": "bcd", 135 | "length": 5 136 | } 137 | }, 138 | { 139 | "label": "#3", 140 | "initials": { 141 | "start": "0x163B", 142 | "encoding": "ch", 143 | "length": 10 144 | }, 145 | "score": { 146 | "start": "0x15EB", 147 | "encoding": "bcd", 148 | "length": 5 149 | } 150 | }, 151 | { 152 | "label": "#4", 153 | "initials": { 154 | "start": "0x1645", 155 | "encoding": "ch", 156 | "length": 10 157 | }, 158 | "score": { 159 | "start": "0x15F0", 160 | "encoding": "bcd", 161 | "length": 5 162 | } 163 | } 164 | ] 165 | } 166 | -------------------------------------------------------------------------------- /maps/dataeast/version2/play_a24.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "2025-11: initial map created by Tom Collins, based on Monday Night Football." 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 3, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "dataeast", 13 | "roms": [ 14 | "play_a24" 15 | ] 16 | }, 17 | "game_state": { 18 | "scores": [ 19 | { 20 | "label": "Player 1", 21 | "start": "0x580", 22 | "encoding": "bcd", 23 | "length": 4, 24 | "scale": 10 25 | }, 26 | { 27 | "label": "Player 2", 28 | "start": "0x5A0", 29 | "encoding": "bcd", 30 | "length": 4, 31 | "scale": 10 32 | }, 33 | { 34 | "label": "Player 3", 35 | "start": "0x5C0", 36 | "encoding": "bcd", 37 | "length": 4, 38 | "scale": 10 39 | }, 40 | { 41 | "label": "Player 4", 42 | "start": "0x5E0", 43 | "encoding": "bcd", 44 | "length": 4, 45 | "scale": 10 46 | } 47 | ], 48 | "credits": { 49 | "label": "Credits", 50 | "start": "0xCD", 51 | "encoding": "bcd" 52 | }, 53 | "max_credits": { 54 | "label": "Maximum Credits", 55 | "start": "0x1F97", 56 | "encoding": "bcd" 57 | }, 58 | "free_play": { 59 | "label": "Free Play", 60 | "start": "0x1F8D", 61 | "encoding": "bool" 62 | }, 63 | "current_player": { 64 | "label": "Current Player", 65 | "start": "0x649", 66 | "encoding": "int" 67 | }, 68 | "player_count": { 69 | "label": "Player Count", 70 | "start": "0x64A", 71 | "mask": "0x7F", 72 | "encoding": "int" 73 | }, 74 | "current_ball": { 75 | "label": "Current Ball", 76 | "start": "0xC9", 77 | "encoding": "int" 78 | }, 79 | "ball_count": { 80 | "label": "Ball Count", 81 | "start": "0x1F94", 82 | "encoding": "int" 83 | }, 84 | "game_over": { 85 | "_notes": "bit 0x80 of player_count == 0x80", 86 | "label": "Game Over", 87 | "start": "0x64A", 88 | "mask": "0x80", 89 | "encoding": "bool" 90 | } 91 | }, 92 | "high_scores": [ 93 | { 94 | "label": "1st Place", 95 | "short_label": "1st", 96 | "initials": { 97 | "start": "0x6A4", 98 | "encoding": "ch", 99 | "length": 3 100 | }, 101 | "score": { 102 | "start": "0x6A0", 103 | "encoding": "bcd", 104 | "length": 4, 105 | "scale": 10 106 | } 107 | }, 108 | { 109 | "label": "2nd Place", 110 | "short_label": "2nd", 111 | "initials": { 112 | "start": "0x6AB", 113 | "encoding": "ch", 114 | "length": 3 115 | }, 116 | "score": { 117 | "start": "0x6A7", 118 | "encoding": "bcd", 119 | "length": 4, 120 | "scale": 10 121 | } 122 | }, 123 | { 124 | "label": "3rd Place", 125 | "short_label": "3rd", 126 | "initials": { 127 | "start": "0x6B2", 128 | "encoding": "ch", 129 | "length": 3 130 | }, 131 | "score": { 132 | "start": "0x6AE", 133 | "encoding": "bcd", 134 | "length": 4, 135 | "scale": 10 136 | } 137 | }, 138 | { 139 | "label": "4th Place", 140 | "short_label": "4th", 141 | "initials": { 142 | "start": "0x6B9", 143 | "encoding": "ch", 144 | "length": 3 145 | }, 146 | "score": { 147 | "start": "0x6B5", 148 | "encoding": "bcd", 149 | "length": 4, 150 | "scale": 10 151 | } 152 | } 153 | ], 154 | "mode_champions": [ 155 | { 156 | "label": "Jackpot Record", 157 | "score": { 158 | "start": "0x1269", 159 | "encoding": "bcd", 160 | "length": 1, 161 | "suffix": " shots" 162 | } 163 | } 164 | ] 165 | } 166 | -------------------------------------------------------------------------------- /maps/dataeast/version2/mnfb_c27.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "2025-11: initial map created by Tom Collins" 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 3, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "dataeast", 13 | "roms": [ 14 | "mnfb_c27", 15 | "mnfb_c29" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "start": "0x580", 23 | "encoding": "bcd", 24 | "length": 4, 25 | "scale": 10 26 | }, 27 | { 28 | "label": "Player 2", 29 | "start": "0x5A0", 30 | "encoding": "bcd", 31 | "length": 4, 32 | "scale": 10 33 | }, 34 | { 35 | "label": "Player 3", 36 | "start": "0x5C0", 37 | "encoding": "bcd", 38 | "length": 4, 39 | "scale": 10 40 | }, 41 | { 42 | "label": "Player 4", 43 | "start": "0x5E0", 44 | "encoding": "bcd", 45 | "length": 4, 46 | "scale": 10 47 | } 48 | ], 49 | "credits": { 50 | "label": "Credits", 51 | "start": "0xCD", 52 | "encoding": "bcd" 53 | }, 54 | "max_credits": { 55 | "label": "Maximum Credits", 56 | "start": "0x1F97", 57 | "encoding": "bcd" 58 | }, 59 | "free_play": { 60 | "label": "Free Play", 61 | "start": "0x1F8D", 62 | "encoding": "bool" 63 | }, 64 | "current_player": { 65 | "label": "Current Player", 66 | "start": "0x649", 67 | "encoding": "int" 68 | }, 69 | "player_count": { 70 | "label": "Player Count", 71 | "start": "0x64A", 72 | "mask": "0x7F", 73 | "encoding": "int" 74 | }, 75 | "current_ball": { 76 | "label": "Current Ball", 77 | "start": "0xED", 78 | "encoding": "int" 79 | }, 80 | "ball_count": { 81 | "label": "Ball Count", 82 | "start": "0x1F94", 83 | "encoding": "int" 84 | }, 85 | "game_over": { 86 | "_notes": "bit 0x80 of player_count == 0x80, or curr_ball == 0?", 87 | "label": "Game Over", 88 | "start": "0x64A", 89 | "mask": "0x80", 90 | "encoding": "bool" 91 | } 92 | }, 93 | "high_scores": [ 94 | { 95 | "label": "1st Place", 96 | "short_label": "1st", 97 | "initials": { 98 | "start": "0x6A4", 99 | "encoding": "ch", 100 | "length": 3 101 | }, 102 | "score": { 103 | "start": "0x6A0", 104 | "encoding": "bcd", 105 | "length": 4, 106 | "scale": 10 107 | } 108 | }, 109 | { 110 | "label": "2nd Place", 111 | "short_label": "2nd", 112 | "initials": { 113 | "start": "0x6AB", 114 | "encoding": "ch", 115 | "length": 3 116 | }, 117 | "score": { 118 | "start": "0x6A7", 119 | "encoding": "bcd", 120 | "length": 4, 121 | "scale": 10 122 | } 123 | }, 124 | { 125 | "label": "3rd Place", 126 | "short_label": "3rd", 127 | "initials": { 128 | "start": "0x6B2", 129 | "encoding": "ch", 130 | "length": 3 131 | }, 132 | "score": { 133 | "start": "0x6AE", 134 | "encoding": "bcd", 135 | "length": 4, 136 | "scale": 10 137 | } 138 | }, 139 | { 140 | "label": "4th Place", 141 | "short_label": "4th", 142 | "initials": { 143 | "start": "0x6B9", 144 | "encoding": "ch", 145 | "length": 3 146 | }, 147 | "score": { 148 | "start": "0x6B5", 149 | "encoding": "bcd", 150 | "length": 4, 151 | "scale": 10 152 | } 153 | } 154 | ], 155 | "mode_champions": [ 156 | { 157 | "_notes": "unknown location for loop count", 158 | "label": "Loop Record", 159 | "initials": { 160 | "start": "0x126A", 161 | "encoding": "ch", 162 | "length": 3 163 | } 164 | } 165 | ] 166 | } 167 | -------------------------------------------------------------------------------- /maps/gottlieb/system3/cueball.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Audits/Adjustments stored in triplicate at 0x680, 0x700, 0x780", 4 | "Based on freddy.map.json." 5 | ], 6 | "_fileformat": 0.7, 7 | "_metadata": { 8 | "version": 2, 9 | "copyright": [ 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "gottlieb-system3", 14 | "roms": [ 15 | "cueball", 16 | "cueball1", 17 | "cueball2", 18 | "cueball3" 19 | ] 20 | }, 21 | "game_state": { 22 | "scores": [ 23 | { 24 | "label": "Player 1", 25 | "encoding": "bcd", 26 | "length": 5, 27 | "start": "0x001" 28 | }, 29 | { 30 | "label": "Player 2", 31 | "encoding": "bcd", 32 | "length": 5, 33 | "start": "0x006" 34 | }, 35 | { 36 | "label": "Player 3", 37 | "encoding": "bcd", 38 | "length": 5, 39 | "start": "0x00B" 40 | }, 41 | { 42 | "label": "Player 4", 43 | "encoding": "bcd", 44 | "length": 5, 45 | "start": "0x010" 46 | } 47 | ], 48 | "credits": { 49 | "_notes": "mirrored to 0x16, 0x5B1, and 0x642 as well", 50 | "label": "Credits", 51 | "start": "0x490", 52 | "encoding": "bcd" 53 | }, 54 | "max_credits": { 55 | "label": "Max Credits", 56 | "start": "0x6D0", 57 | "encoding": "bcd" 58 | }, 59 | "current_ball": { 60 | "_notes": "set to 0 when game over", 61 | "label": "Ball", 62 | "start": "0x15", 63 | "encoding": "bcd" 64 | }, 65 | "ball_count": { 66 | "label": "Ball Count", 67 | "start": "0x6D2", 68 | "encoding": "bcd" 69 | }, 70 | "current_player": { 71 | "_notes": "0-3; bit 7 (0x80) sometimes set?", 72 | "label": "Current Player", 73 | "short_label": "P#", 74 | "start": "0x200", 75 | "encoding": "int", 76 | "mask": "0x0F", 77 | "offset": 1 78 | }, 79 | "player_count": { 80 | "_notes": "set to 0 when game over", 81 | "label": "Player Count", 82 | "short_label": "Players", 83 | "start": "0x201", 84 | "encoding": "int" 85 | }, 86 | "game_over": { 87 | "label": "Game Over", 88 | "start": "0x201", 89 | "encoding": "bool", 90 | "invert": true 91 | } 92 | }, 93 | "high_scores": [ 94 | { 95 | "label": "High Score #1", 96 | "short_label": "#1", 97 | "initials": { 98 | "start": "0x68C", 99 | "encoding": "ch", 100 | "length": 3 101 | }, 102 | "score": { 103 | "encoding": "bcd", 104 | "length": 5, 105 | "start": "0x6A5" 106 | } 107 | }, 108 | { 109 | "label": "High Score #2", 110 | "short_label": "#2", 111 | "initials": { 112 | "start": "0x691", 113 | "encoding": "ch", 114 | "length": 3 115 | }, 116 | "score": { 117 | "encoding": "bcd", 118 | "length": 5, 119 | "start": "0x6AA" 120 | } 121 | }, 122 | { 123 | "label": "High Score #3", 124 | "short_label": "#3", 125 | "initials": { 126 | "start": "0x696", 127 | "encoding": "ch", 128 | "length": 3 129 | }, 130 | "score": { 131 | "encoding": "bcd", 132 | "length": 5, 133 | "start": "0x6AF" 134 | } 135 | }, 136 | { 137 | "label": "High Score #4", 138 | "short_label": "#4", 139 | "initials": { 140 | "start": "0x69B", 141 | "encoding": "ch", 142 | "length": 3 143 | }, 144 | "score": { 145 | "encoding": "bcd", 146 | "length": 5, 147 | "start": "0x6B4" 148 | } 149 | }, 150 | { 151 | "label": "High Score #5", 152 | "short_label": "#5", 153 | "initials": { 154 | "start": "0x6A0", 155 | "encoding": "ch", 156 | "length": 3 157 | }, 158 | "score": { 159 | "encoding": "bcd", 160 | "length": 5, 161 | "start": "0x6B9" 162 | } 163 | } 164 | ] 165 | } 166 | -------------------------------------------------------------------------------- /maps/stern/whitestar/ripleys.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on Sopranos." 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 2, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "whitestar", 13 | "roms": [ 14 | "ripleys", 15 | "ripleysf", 16 | "ripleysg", 17 | "ripleysi", 18 | "ripleysl", 19 | "rip310", 20 | "rip310f", 21 | "rip310g", 22 | "rip310i", 23 | "rip310l", 24 | "rip302", 25 | "rip302f", 26 | "rip302g", 27 | "rip302i", 28 | "rip302l", 29 | "rip301", 30 | "rip301f", 31 | "rip301g", 32 | "rip301i", 33 | "rip301l" 34 | ] 35 | }, 36 | "game_state": { 37 | "scores": [ 38 | { 39 | "label": "Player 1", 40 | "start": "0x1656", 41 | "length": 5, 42 | "encoding": "bcd" 43 | }, 44 | { 45 | "label": "Player 2", 46 | "start": "0x165B", 47 | "length": 5, 48 | "encoding": "bcd" 49 | }, 50 | { 51 | "label": "Player 3", 52 | "start": "0x1660", 53 | "length": 5, 54 | "encoding": "bcd" 55 | }, 56 | { 57 | "label": "Player 4", 58 | "start": "0x1665", 59 | "length": 5, 60 | "encoding": "bcd" 61 | } 62 | ], 63 | "credits": { 64 | "label": "Credits", 65 | "start": "0x164F", 66 | "encoding": "bcd" 67 | }, 68 | "max_credits": { 69 | "label": "Max Credits", 70 | "start": "0x1E0F", 71 | "encoding": "bcd" 72 | }, 73 | "free_play": { 74 | "label": "Free Play", 75 | "start": "0x1E05", 76 | "encoding": "bool" 77 | }, 78 | "tilted": { 79 | "label": "Tilted", 80 | "start": "0x324", 81 | "encoding": "bool" 82 | }, 83 | "current_player": { 84 | "label": "Current Player", 85 | "start": "0x326", 86 | "encoding": "bcd" 87 | }, 88 | "current_ball": { 89 | "label": "Current Ball", 90 | "start": "0x327", 91 | "encoding": "bcd" 92 | }, 93 | "player_count": { 94 | "label": "Player Count", 95 | "start": "0x328", 96 | "encoding": "bcd" 97 | }, 98 | "ball_count": { 99 | "label": "Ball Count", 100 | "start": "0x1E0D", 101 | "encoding": "bcd" 102 | }, 103 | "game_over": { 104 | "_notes": "current_player == 0", 105 | "label": "Game Over", 106 | "start": "0x326", 107 | "encoding": "bool", 108 | "invert": true 109 | } 110 | }, 111 | "high_scores": [ 112 | { 113 | "label": "Grand Champ", 114 | "short_label": "GC", 115 | "initials": { 116 | "start": "0x161D", 117 | "encoding": "ch", 118 | "length": 10 119 | }, 120 | "score": { 121 | "start": "0x15DC", 122 | "encoding": "bcd", 123 | "length": 5 124 | } 125 | }, 126 | { 127 | "label": "#1", 128 | "initials": { 129 | "start": "0x1627", 130 | "encoding": "ch", 131 | "length": 10 132 | }, 133 | "score": { 134 | "start": "0x15E1", 135 | "encoding": "bcd", 136 | "length": 5 137 | } 138 | }, 139 | { 140 | "label": "#2", 141 | "initials": { 142 | "start": "0x1631", 143 | "encoding": "ch", 144 | "length": 10 145 | }, 146 | "score": { 147 | "start": "0x15E6", 148 | "encoding": "bcd", 149 | "length": 5 150 | } 151 | }, 152 | { 153 | "label": "#3", 154 | "initials": { 155 | "start": "0x163B", 156 | "encoding": "ch", 157 | "length": 10 158 | }, 159 | "score": { 160 | "start": "0x15EB", 161 | "encoding": "bcd", 162 | "length": 5 163 | } 164 | }, 165 | { 166 | "label": "#4", 167 | "initials": { 168 | "start": "0x1645", 169 | "encoding": "ch", 170 | "length": 10 171 | }, 172 | "score": { 173 | "start": "0x15F0", 174 | "encoding": "bcd", 175 | "length": 5 176 | } 177 | } 178 | ] 179 | } 180 | -------------------------------------------------------------------------------- /maps/stern/whitestar/sopranos.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on lotr." 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "whitestar", 13 | "roms": [ 14 | "sopranos", 15 | "sopranog", 16 | "sopranof", 17 | "sopranol", 18 | "sopranoi", 19 | "sopr400", 20 | "sopr400g", 21 | "sopr400f", 22 | "sopr400l", 23 | "sopr400i", 24 | "sopr300", 25 | "soprano3", 26 | "sopr300g", 27 | "sopr300f", 28 | "sopr300l", 29 | "sopr300i", 30 | "sopr204", 31 | "sopr107g", 32 | "sopr107f", 33 | "sopr107l", 34 | "sopr107i" 35 | ] 36 | }, 37 | "game_state": { 38 | "scores": [ 39 | { 40 | "label": "Player 1", 41 | "start": "0x1656", 42 | "length": 5, 43 | "encoding": "bcd" 44 | }, 45 | { 46 | "label": "Player 2", 47 | "start": "0x165B", 48 | "length": 5, 49 | "encoding": "bcd" 50 | }, 51 | { 52 | "label": "Player 3", 53 | "start": "0x1660", 54 | "length": 5, 55 | "encoding": "bcd" 56 | }, 57 | { 58 | "label": "Player 4", 59 | "start": "0x1665", 60 | "length": 5, 61 | "encoding": "bcd" 62 | } 63 | ], 64 | "credits": { 65 | "label": "Credits", 66 | "start": "0x164F", 67 | "encoding": "bcd" 68 | }, 69 | "max_credits": { 70 | "label": "Max Credits", 71 | "start": "0x1E0F", 72 | "encoding": "bcd" 73 | }, 74 | "free_play": { 75 | "label": "Free Play", 76 | "start": "0x1E05", 77 | "encoding": "bool" 78 | }, 79 | "tilted": { 80 | "label": "Tilted", 81 | "start": "0x31E", 82 | "encoding": "bool" 83 | }, 84 | "current_player": { 85 | "_notes": "move to 0x320", 86 | "label": "Current Player", 87 | "start": "0x320", 88 | "encoding": "bcd" 89 | }, 90 | "current_ball": { 91 | "label": "Current Ball", 92 | "start": "0x321", 93 | "encoding": "bcd" 94 | }, 95 | "player_count": { 96 | "label": "Player Count", 97 | "start": "0x322", 98 | "encoding": "bcd" 99 | }, 100 | "ball_count": { 101 | "label": "Ball Count", 102 | "start": "0x1E0D", 103 | "encoding": "bcd" 104 | }, 105 | "game_over": { 106 | "_notes": "current_player == 0", 107 | "label": "Game Over", 108 | "start": "0x320", 109 | "encoding": "bool", 110 | "invert": true 111 | } 112 | }, 113 | "high_scores": [ 114 | { 115 | "label": "Grand Champ", 116 | "short_label": "GC", 117 | "initials": { 118 | "start": "0x161D", 119 | "encoding": "ch", 120 | "length": 10 121 | }, 122 | "score": { 123 | "start": "0x15DC", 124 | "encoding": "bcd", 125 | "length": 5 126 | } 127 | }, 128 | { 129 | "label": "#1", 130 | "initials": { 131 | "start": "0x1627", 132 | "encoding": "ch", 133 | "length": 10 134 | }, 135 | "score": { 136 | "start": "0x15E1", 137 | "encoding": "bcd", 138 | "length": 5 139 | } 140 | }, 141 | { 142 | "label": "#2", 143 | "initials": { 144 | "start": "0x1631", 145 | "encoding": "ch", 146 | "length": 10 147 | }, 148 | "score": { 149 | "start": "0x15E6", 150 | "encoding": "bcd", 151 | "length": 5 152 | } 153 | }, 154 | { 155 | "label": "#3", 156 | "initials": { 157 | "start": "0x163B", 158 | "encoding": "ch", 159 | "length": 10 160 | }, 161 | "score": { 162 | "start": "0x15EB", 163 | "encoding": "bcd", 164 | "length": 5 165 | } 166 | }, 167 | { 168 | "label": "#4", 169 | "initials": { 170 | "start": "0x1645", 171 | "encoding": "ch", 172 | "length": 10 173 | }, 174 | "score": { 175 | "start": "0x15F0", 176 | "encoding": "bcd", 177 | "length": 5 178 | } 179 | } 180 | ] 181 | } 182 | -------------------------------------------------------------------------------- /maps/gottlieb/system3/freddy.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Audits/Adjustments stored in triplicate at 0xD00, 0xE00, 0xF00" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 2, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "gottlieb-system3", 13 | "roms": [ 14 | "freddy", 15 | "freddy4" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "bcd", 23 | "length": 5, 24 | "start": "0x001" 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "bcd", 29 | "length": 5, 30 | "start": "0x006" 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "bcd", 35 | "length": 5, 36 | "start": "0x00B" 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "bcd", 41 | "length": 5, 42 | "start": "0x010" 43 | } 44 | ], 45 | "credits": { 46 | "_notes": "mirrored to 0x16, 0xAF5, and 0xBF2 as well", 47 | "label": "Credits", 48 | "start": "0x8FC", 49 | "encoding": "bcd" 50 | }, 51 | "max_credits": { 52 | "label": "Max Credits", 53 | "start": "0xD5D", 54 | "encoding": "bcd" 55 | }, 56 | "current_ball": { 57 | "_notes": "set to 0 when game over", 58 | "label": "Ball", 59 | "start": "0x15", 60 | "encoding": "bcd" 61 | }, 62 | "ball_count": { 63 | "label": "Ball Count", 64 | "start": "0xD5F", 65 | "encoding": "bcd" 66 | }, 67 | "current_player": { 68 | "_notes": "0-3; bit 7 (0x80) sometimes set?", 69 | "label": "Current Player", 70 | "short_label": "P#", 71 | "start": "0x200", 72 | "encoding": "int", 73 | "mask": "0x0F", 74 | "offset": 1 75 | }, 76 | "player_count": { 77 | "_notes": "set to 0 when game over", 78 | "label": "Player Count", 79 | "short_label": "Players", 80 | "start": "0x201", 81 | "encoding": "int" 82 | }, 83 | "game_over": { 84 | "label": "Game Over", 85 | "start": "0x201", 86 | "encoding": "bool", 87 | "invert": true 88 | } 89 | }, 90 | "high_scores": [ 91 | { 92 | "label": "Dream Master", 93 | "short_label": "#1", 94 | "initials": { 95 | "start": "0xD0C", 96 | "encoding": "ch", 97 | "length": 3 98 | }, 99 | "score": { 100 | "encoding": "bcd", 101 | "length": 5, 102 | "start": "0xD25" 103 | } 104 | }, 105 | { 106 | "label": "Dream Warrior #2", 107 | "short_label": "#2", 108 | "initials": { 109 | "start": "0xD11", 110 | "encoding": "ch", 111 | "length": 3 112 | }, 113 | "score": { 114 | "encoding": "bcd", 115 | "length": 5, 116 | "start": "0xD2A" 117 | } 118 | }, 119 | { 120 | "label": "Dream Warrior #3", 121 | "short_label": "#3", 122 | "initials": { 123 | "start": "0xD16", 124 | "encoding": "ch", 125 | "length": 3 126 | }, 127 | "score": { 128 | "encoding": "bcd", 129 | "length": 5, 130 | "start": "0xD2F" 131 | } 132 | }, 133 | { 134 | "label": "Dream Warrior #4", 135 | "short_label": "#4", 136 | "initials": { 137 | "start": "0xD1B", 138 | "encoding": "ch", 139 | "length": 3 140 | }, 141 | "score": { 142 | "encoding": "bcd", 143 | "length": 5, 144 | "start": "0xD34" 145 | } 146 | }, 147 | { 148 | "label": "Dream Warrior #5", 149 | "short_label": "#5", 150 | "initials": { 151 | "start": "0xD20", 152 | "encoding": "ch", 153 | "length": 3 154 | }, 155 | "score": { 156 | "encoding": "bcd", 157 | "length": 5, 158 | "start": "0xD39" 159 | } 160 | } 161 | ], 162 | "mode_champions": [ 163 | { 164 | "label": "Most Souls Saved", 165 | "initials": { 166 | "start": "0x650", 167 | "encoding": "ch", 168 | "length": 3 169 | }, 170 | "score": { 171 | "start": "0xD7E", 172 | "encoding": "bcd", 173 | "length": 2 174 | } 175 | } 176 | ] 177 | } 178 | -------------------------------------------------------------------------------- /maps/stern/whitestar/lotr.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on simpprty." 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C) 2025 by Tom Collins " 10 | ], 11 | "license": "GNU Lesser General Public License v3.0", 12 | "platform": "whitestar", 13 | "roms": [ 14 | "lotr_fr", 15 | "lotr_fr8", 16 | "lotr_fr9", 17 | "lotr_gr", 18 | "lotr_gr8", 19 | "lotr_gr9", 20 | "lotr_it", 21 | "lotr_it8", 22 | "lotr_it9", 23 | "lotr_le", 24 | "lotr_sp", 25 | "lotr_sp8", 26 | "lotr_sp9", 27 | "lotr", 28 | "lotr8", 29 | "lotr9" 30 | ] 31 | }, 32 | "game_state": { 33 | "scores": [ 34 | { 35 | "label": "Player 1", 36 | "start": "0x165B", 37 | "length": 5, 38 | "encoding": "bcd" 39 | }, 40 | { 41 | "label": "Player 2", 42 | "start": "0x1660", 43 | "length": 5, 44 | "encoding": "bcd" 45 | }, 46 | { 47 | "label": "Player 3", 48 | "start": "0x1665", 49 | "length": 5, 50 | "encoding": "bcd" 51 | }, 52 | { 53 | "label": "Player 4", 54 | "start": "0x166A", 55 | "length": 5, 56 | "encoding": "bcd" 57 | } 58 | ], 59 | "credits": { 60 | "label": "Credits", 61 | "start": "0x1654", 62 | "encoding": "bcd" 63 | }, 64 | "max_credits": { 65 | "label": "Max Credits", 66 | "start": "0x1E0F", 67 | "encoding": "bcd" 68 | }, 69 | "free_play": { 70 | "label": "Free Play", 71 | "start": "0x1E05", 72 | "encoding": "bool" 73 | }, 74 | "tilted": { 75 | "label": "Tilted", 76 | "start": "0x368", 77 | "encoding": "bool" 78 | }, 79 | "current_player": { 80 | "label": "Current Player", 81 | "start": "0x36A", 82 | "encoding": "bcd" 83 | }, 84 | "current_ball": { 85 | "label": "Current Ball", 86 | "start": "0x36B", 87 | "encoding": "bcd" 88 | }, 89 | "player_count": { 90 | "label": "Player Count", 91 | "start": "0x36C", 92 | "encoding": "bcd" 93 | }, 94 | "ball_count": { 95 | "label": "Ball Count", 96 | "start": "0x1E0D", 97 | "encoding": "bcd" 98 | }, 99 | "game_over": { 100 | "_notes": "current_player == 0", 101 | "label": "Game Over", 102 | "start": "0x36A", 103 | "encoding": "bool", 104 | "invert": true 105 | } 106 | }, 107 | "high_scores": [ 108 | { 109 | "label": "Grand Champ", 110 | "short_label": "GC", 111 | "initials": { 112 | "start": "0x161D", 113 | "encoding": "ch", 114 | "length": 10 115 | }, 116 | "score": { 117 | "start": "0x15DC", 118 | "encoding": "bcd", 119 | "length": 5 120 | } 121 | }, 122 | { 123 | "label": "#1", 124 | "initials": { 125 | "start": "0x1627", 126 | "encoding": "ch", 127 | "length": 10 128 | }, 129 | "score": { 130 | "start": "0x15E1", 131 | "encoding": "bcd", 132 | "length": 5 133 | } 134 | }, 135 | { 136 | "label": "#2", 137 | "initials": { 138 | "start": "0x1631", 139 | "encoding": "ch", 140 | "length": 10 141 | }, 142 | "score": { 143 | "start": "0x15E6", 144 | "encoding": "bcd", 145 | "length": 5 146 | } 147 | }, 148 | { 149 | "label": "#3", 150 | "initials": { 151 | "start": "0x163B", 152 | "encoding": "ch", 153 | "length": 10 154 | }, 155 | "score": { 156 | "start": "0x15EB", 157 | "encoding": "bcd", 158 | "length": 5 159 | } 160 | }, 161 | { 162 | "label": "#4", 163 | "initials": { 164 | "start": "0x1645", 165 | "encoding": "ch", 166 | "length": 10 167 | }, 168 | "score": { 169 | "start": "0x15F0", 170 | "encoding": "bcd", 171 | "length": 5 172 | } 173 | } 174 | ], 175 | "mode_champions": [ 176 | { 177 | "label": "Destroy Ring Champion", 178 | "initials": { 179 | "start": "0x1651", 180 | "length": 3, 181 | "encoding": "ch" 182 | }, 183 | "score": { 184 | "_notes": "16-bit integer in units of 0.01s", 185 | "start": "0x164F", 186 | "length": 2, 187 | "encoding": "int", 188 | "scale": 0.01, 189 | "units": "seconds" 190 | } 191 | } 192 | ] 193 | } 194 | -------------------------------------------------------------------------------- /maps/dataeast/version3b/baywatch.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins ", 4 | "bay_f201 & bay_g300 player_count @ 0x1C9; possibly other changes" 5 | ], 6 | "_fileformat": 0.8, 7 | "_metadata": { 8 | "version": 2, 9 | "copyright": [ 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "dataeast", 14 | "roms": [ 15 | "baywatch", 16 | "bay_401", 17 | "bay_d400", 18 | "bay_e400" 19 | ] 20 | }, 21 | "game_state": { 22 | "scores": [ 23 | { 24 | "label": "Player 1", 25 | "start": "0x16D5", 26 | "encoding": "bcd", 27 | "length": 5 28 | }, 29 | { 30 | "label": "Player 2", 31 | "start": "0x16DA", 32 | "encoding": "bcd", 33 | "length": 5 34 | }, 35 | { 36 | "label": "Player 3", 37 | "start": "0x16DF", 38 | "encoding": "bcd", 39 | "length": 5 40 | }, 41 | { 42 | "label": "Player 4", 43 | "start": "0x16E4", 44 | "encoding": "bcd", 45 | "length": 5 46 | }, 47 | { 48 | "label": "Player 5", 49 | "start": "0x16E9", 50 | "encoding": "bcd", 51 | "length": 5 52 | }, 53 | { 54 | "label": "Player 6", 55 | "start": "0x16EE", 56 | "encoding": "bcd", 57 | "length": 5 58 | } 59 | ], 60 | "credits": { 61 | "label": "Credits", 62 | "start": "0x16CC", 63 | "encoding": "bcd" 64 | }, 65 | "free_play": { 66 | "label": "Free Play", 67 | "start": "0x1E04", 68 | "encoding": "bool" 69 | }, 70 | "max_credits": { 71 | "label": "Max Credits", 72 | "start": "0x1E0F", 73 | "encoding": "bcd" 74 | }, 75 | "player_count": { 76 | "label": "Player Count", 77 | "start": "0x1D1", 78 | "encoding": "int" 79 | }, 80 | "ball_count": { 81 | "label": "Ball Count", 82 | "start": "0x1E0D", 83 | "encoding": "bcd" 84 | }, 85 | "current_player": { 86 | "label": "Player", 87 | "start": "0x1CE", 88 | "encoding": "int" 89 | }, 90 | "current_ball": { 91 | "label": "Ball", 92 | "start": "0x1CF", 93 | "encoding": "int" 94 | }, 95 | "game_over": { 96 | "_notes": "game is over if current player/ball is 0", 97 | "label": "Game Over", 98 | "start": "0x1CE", 99 | "encoding": "bool", 100 | "invert": true 101 | } 102 | }, 103 | "high_scores": [ 104 | { 105 | "label": "High Score #1", 106 | "short_label": "#1", 107 | "initials": { 108 | "start": "0x16BA", 109 | "encoding": "ch", 110 | "length": 3 111 | }, 112 | "score": { 113 | "start": "0x167C", 114 | "encoding": "bcd", 115 | "length": 5 116 | } 117 | }, 118 | { 119 | "label": "High Score #2", 120 | "short_label": "#2", 121 | "initials": { 122 | "start": "0x16BD", 123 | "encoding": "ch", 124 | "length": 3 125 | }, 126 | "score": { 127 | "start": "0x1681", 128 | "encoding": "bcd", 129 | "length": 5 130 | } 131 | }, 132 | { 133 | "label": "High Score #3", 134 | "short_label": "#3", 135 | "initials": { 136 | "start": "0x16C0", 137 | "encoding": "ch", 138 | "length": 3 139 | }, 140 | "score": { 141 | "start": "0x1686", 142 | "encoding": "bcd", 143 | "length": 5 144 | } 145 | }, 146 | { 147 | "label": "High Score #4", 148 | "short_label": "#4", 149 | "initials": { 150 | "start": "0x16C3", 151 | "encoding": "ch", 152 | "length": 3 153 | }, 154 | "score": { 155 | "start": "0x168B", 156 | "encoding": "bcd", 157 | "length": 5 158 | } 159 | }, 160 | { 161 | "label": "High Score #5", 162 | "short_label": "#5", 163 | "initials": { 164 | "start": "0x16C6", 165 | "encoding": "ch", 166 | "length": 3 167 | }, 168 | "score": { 169 | "start": "0x1690", 170 | "encoding": "bcd", 171 | "length": 5 172 | } 173 | }, 174 | { 175 | "label": "High Score #6", 176 | "short_label": "#6", 177 | "initials": { 178 | "start": "0x16C9", 179 | "encoding": "ch", 180 | "length": 3 181 | }, 182 | "score": { 183 | "start": "0x1695", 184 | "encoding": "bcd", 185 | "length": 5 186 | } 187 | } 188 | ] 189 | } 190 | -------------------------------------------------------------------------------- /tools/set-platform.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | Set the `platform` metadata for one or more `.map.json` files. 4 | 5 | - Add `_metadata.platform` attribute. 6 | - Remove `endian`, `nibble`, and `ramsize` from `_metadata`. 7 | - Increase all non-dipsw `start`, `end` and `offsets` properties by the 8 | base address of the platform's nvram entry. 9 | """ 10 | 11 | import argparse 12 | import json 13 | import os 14 | 15 | from collections import OrderedDict 16 | from typing import Union 17 | 18 | 19 | def to_int(v: Union[int, str]) -> int: 20 | """Returns 'v' if already an int, otherwise assume a string and convert 21 | with a base of '0' (which handles leading 0 as octal and 0x as hex). 22 | (Code copied from py-pinmame-nvmaps project.) 23 | """ 24 | if type(v) is int: 25 | return v 26 | return int(v, 0) 27 | 28 | def shift_map_base(record: Union[list, dict], offset: int) -> None: 29 | """ 30 | Recursively walk the map, looking for attributes to update. 31 | 32 | :param record: A portion of the map to process. 33 | :param offset: Base address of nvram area for this platform. 34 | :return: None 35 | """ 36 | if type(record) is list: 37 | for item in record: 38 | shift_map_base(item, offset) 39 | elif type(record) in [dict, OrderedDict]: 40 | if record.get('encoding') == 'dipsw': 41 | # ignore DIP switch records 42 | return 43 | for key, value in record.items(): 44 | if key in ['start', 'end', 'offsets']: 45 | record[key] = '0x%04X' % (to_int(value) + offset) 46 | else: 47 | shift_map_base(value, offset) 48 | 49 | 50 | PLATFORM_DIR = os.path.join(os.path.dirname(__file__), '../platforms') 51 | 52 | parser = argparse.ArgumentParser(description='Maps Platform Setter') 53 | parser.add_argument('--platform', required=True, 54 | help='platform (without .json extension) to apply') 55 | parser.add_argument('maps', nargs='+') 56 | args = parser.parse_args() 57 | 58 | try: 59 | with open(os.path.join(PLATFORM_DIR, args.platform + '.json')) as platform_file: 60 | platform_json = json.load(platform_file) 61 | except FileNotFoundError: 62 | print("Error couldn't open platforms/%s.json" % platform_file) 63 | exit(-1) 64 | 65 | # find the first nvram entry in the platform file 66 | area = None 67 | for area in platform_json.get('memory_layout'): 68 | if area.get('type') == 'nvram': 69 | break 70 | if not area: 71 | print("Error: unable to find nvram entry in platform's memory_layout.") 72 | exit(-1) 73 | 74 | for file in args.maps: 75 | print('Adding platform to %s...' % file) 76 | errors = 0 77 | with open(file) as map_file: 78 | map_json = json.load(map_file, object_pairs_hook=OrderedDict) 79 | metadata = map_json.get('_metadata') 80 | existing_platform = metadata.get('platform') 81 | if existing_platform: 82 | print('...map already using platform %s' % existing_platform) 83 | continue 84 | map_endian = metadata.get('endian', '(undefined)') 85 | platform_endian = platform_json.get('endian', '(undefined)') 86 | if map_endian != platform_endian: 87 | print("Error: `endian` from map (%s) doesn't match value from platform (%s)" 88 | % (map_endian, platform_endian)) 89 | errors += 1 90 | map_nibble = metadata.get('nibble', 'both') 91 | platform_nibble = area.get('nibble', 'both') 92 | if map_nibble != platform_nibble: 93 | print("Error: `nibble` from map (%s) doesn't match platform's nvram.nibble (%s)" 94 | % (map_nibble, platform_nibble)) 95 | errors += 1 96 | 97 | # Some maps have the .nv file size for ramsize, but that includes 98 | # additional bytes appended by PinMAME. Round down to a multiple of 128. 99 | map_ramsize = metadata.get('ramsize', 0) & 0xFFFFFF80 100 | platform_ramsize = to_int(area.get('size')) 101 | if map_ramsize and map_ramsize != platform_ramsize: 102 | print("Skipping: `ramsize` from map (%u) doesn't match platform's nvram.size (%u)" 103 | % (map_ramsize, platform_ramsize)) 104 | continue 105 | 106 | if errors: 107 | print("Aborting update of %s due to errors." % file) 108 | exit(-1) 109 | 110 | for attribute in ['endian', 'nibble', 'ramsize']: 111 | metadata.pop(attribute, None) 112 | 113 | # add platform to metadata, close to where endian/nibble/ramsize typically appeared 114 | metadata['platform'] = args.platform 115 | for entry in ['platform', 'license', 'copyright', 'version']: 116 | if entry in metadata: 117 | metadata.move_to_end(entry, last=False) 118 | 119 | nvram_base = to_int(area.get('address')) 120 | if nvram_base: 121 | print("Shifting map by 0x%X bytes..." % nvram_base) 122 | shift_map_base(map_json, nvram_base) 123 | 124 | with open(file, 'w') as outfile: 125 | outfile.write(json.dumps(map_json, indent=2)) 126 | # add trailing newline to match `jq` output 127 | outfile.write('\n') 128 | -------------------------------------------------------------------------------- /maps/stern/sam/st_162.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on st_162h by HorsePin" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C)2024 by Tom Collins ", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "stern-sam", 14 | "roms": [ 15 | "st_162" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "int", 23 | "length": 4, 24 | "start": "0x21109E4" 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "int", 29 | "length": 4, 30 | "start": "0x21109E8" 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "int", 35 | "length": 4, 36 | "start": "0x21109EC" 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "int", 41 | "length": 4, 42 | "start": "0x21109F0" 43 | } 44 | ] 45 | }, 46 | "high_scores": [ 47 | { 48 | "label": "Grand Champion", 49 | "short_label": "GC", 50 | "initials": { 51 | "encoding": "ch", 52 | "null": "terminate", 53 | "length": 11, 54 | "start": "0x2102EC0" 55 | }, 56 | "score": { 57 | "encoding": "int", 58 | "length": 4, 59 | "start": "0x2102ED8" 60 | } 61 | }, 62 | { 63 | "label": "High Score #1", 64 | "short_label": "#1", 65 | "initials": { 66 | "encoding": "ch", 67 | "null": "terminate", 68 | "length": 11, 69 | "start": "0x2102EE0" 70 | }, 71 | "score": { 72 | "encoding": "int", 73 | "length": 4, 74 | "start": "0x2102EF8" 75 | } 76 | }, 77 | { 78 | "label": "High Score #2", 79 | "short_label": "#2", 80 | "initials": { 81 | "encoding": "ch", 82 | "null": "terminate", 83 | "length": 11, 84 | "start": "0x2102F00" 85 | }, 86 | "score": { 87 | "encoding": "int", 88 | "length": 4, 89 | "start": "0x2102F18" 90 | } 91 | }, 92 | { 93 | "label": "High Score #3", 94 | "short_label": "#3", 95 | "initials": { 96 | "encoding": "ch", 97 | "null": "terminate", 98 | "length": 11, 99 | "start": "0x2102F20" 100 | }, 101 | "score": { 102 | "encoding": "int", 103 | "length": 4, 104 | "start": "0x2102F38" 105 | } 106 | }, 107 | { 108 | "label": "High Score #4", 109 | "short_label": "#4", 110 | "initials": { 111 | "encoding": "ch", 112 | "null": "terminate", 113 | "length": 11, 114 | "start": "0x2102F40" 115 | }, 116 | "score": { 117 | "encoding": "int", 118 | "length": 4, 119 | "start": "0x2102F58" 120 | } 121 | } 122 | ], 123 | "mode_champions": [ 124 | { 125 | "label": "Combo Champion", 126 | "initials": { 127 | "encoding": "ch", 128 | "null": "terminate", 129 | "length": 11, 130 | "start": "0x2102F60" 131 | }, 132 | "score": { 133 | "encoding": "int", 134 | "length": 4, 135 | "start": "0x2102F78", 136 | "suffix": " Combos" 137 | } 138 | }, 139 | { 140 | "label": "Warp Champion", 141 | "initials": { 142 | "encoding": "ch", 143 | "null": "terminate", 144 | "length": 11, 145 | "start": "0x2102F80" 146 | }, 147 | "score": { 148 | "encoding": "int", 149 | "length": 4, 150 | "start": "0x2102F98", 151 | "suffix": " Warps" 152 | } 153 | }, 154 | { 155 | "label": "Medals Champion", 156 | "initials": { 157 | "encoding": "ch", 158 | "null": "terminate", 159 | "length": 11, 160 | "start": "0x2102FA0" 161 | }, 162 | "score": { 163 | "encoding": "int", 164 | "length": 4, 165 | "start": "0x2102FB8", 166 | "suffix": " Medals" 167 | } 168 | } 169 | ], 170 | "checksum16": [ 171 | { 172 | "start": "0x2102EC0", 173 | "length": 30, 174 | "label": "Grand Champion" 175 | }, 176 | { 177 | "start": "0x2102EE0", 178 | "length": 30, 179 | "label": "High Score #1" 180 | }, 181 | { 182 | "start": "0x2102F00", 183 | "length": 30, 184 | "label": "High Score #2" 185 | }, 186 | { 187 | "start": "0x2102F20", 188 | "length": 30, 189 | "label": "High Score #3" 190 | }, 191 | { 192 | "start": "0x2102F40", 193 | "length": 30, 194 | "label": "High Score #4" 195 | }, 196 | { 197 | "start": "0x2102F60", 198 | "length": 30, 199 | "label": "Combo Champion" 200 | }, 201 | { 202 | "start": "0x2102F80", 203 | "length": 30, 204 | "label": "Warp Champion" 205 | }, 206 | { 207 | "start": "0x2102FA0", 208 | "length": 30, 209 | "label": "Medals Champion" 210 | } 211 | ] 212 | } 213 | -------------------------------------------------------------------------------- /maps/stern/sam/st_161h.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on st_162h by HorsePin" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C)2024 by Tom Collins ", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "stern-sam", 14 | "roms": [ 15 | "st_161h" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "int", 23 | "length": 4, 24 | "start": "0x2110A0C" 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "int", 29 | "length": 4, 30 | "start": "0x2110A10" 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "int", 35 | "length": 4, 36 | "start": "0x2110A14" 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "int", 41 | "length": 4, 42 | "start": "0x2110A18" 43 | } 44 | ] 45 | }, 46 | "high_scores": [ 47 | { 48 | "label": "Grand Champion", 49 | "short_label": "GC", 50 | "initials": { 51 | "encoding": "ch", 52 | "null": "terminate", 53 | "length": 11, 54 | "start": "0x2102E80" 55 | }, 56 | "score": { 57 | "encoding": "int", 58 | "length": 4, 59 | "start": "0x2102E98" 60 | } 61 | }, 62 | { 63 | "label": "High Score #1", 64 | "short_label": "#1", 65 | "initials": { 66 | "encoding": "ch", 67 | "null": "terminate", 68 | "length": 11, 69 | "start": "0x2102EA0" 70 | }, 71 | "score": { 72 | "encoding": "int", 73 | "length": 4, 74 | "start": "0x2102EB8" 75 | } 76 | }, 77 | { 78 | "label": "High Score #2", 79 | "short_label": "#2", 80 | "initials": { 81 | "encoding": "ch", 82 | "null": "terminate", 83 | "length": 11, 84 | "start": "0x2102EC0" 85 | }, 86 | "score": { 87 | "encoding": "int", 88 | "length": 4, 89 | "start": "0x2102ED8" 90 | } 91 | }, 92 | { 93 | "label": "High Score #3", 94 | "short_label": "#3", 95 | "initials": { 96 | "encoding": "ch", 97 | "null": "terminate", 98 | "length": 11, 99 | "start": "0x2102EE0" 100 | }, 101 | "score": { 102 | "encoding": "int", 103 | "length": 4, 104 | "start": "0x2102EF8" 105 | } 106 | }, 107 | { 108 | "label": "High Score #4", 109 | "short_label": "#4", 110 | "initials": { 111 | "encoding": "ch", 112 | "null": "terminate", 113 | "length": 11, 114 | "start": "0x2102F00" 115 | }, 116 | "score": { 117 | "encoding": "int", 118 | "length": 4, 119 | "start": "0x2102F18" 120 | } 121 | } 122 | ], 123 | "mode_champions": [ 124 | { 125 | "label": "Combo Champion", 126 | "initials": { 127 | "encoding": "ch", 128 | "null": "terminate", 129 | "length": 11, 130 | "start": "0x2102F20" 131 | }, 132 | "score": { 133 | "encoding": "int", 134 | "length": 4, 135 | "start": "0x2102F38", 136 | "suffix": " Combos" 137 | } 138 | }, 139 | { 140 | "label": "Warp Champion", 141 | "initials": { 142 | "encoding": "ch", 143 | "null": "terminate", 144 | "length": 11, 145 | "start": "0x2102F40" 146 | }, 147 | "score": { 148 | "encoding": "int", 149 | "length": 4, 150 | "start": "0x2102F58", 151 | "suffix": " Warps" 152 | } 153 | }, 154 | { 155 | "label": "Medals Champion", 156 | "initials": { 157 | "encoding": "ch", 158 | "null": "terminate", 159 | "length": 11, 160 | "start": "0x2102F60" 161 | }, 162 | "score": { 163 | "encoding": "int", 164 | "length": 4, 165 | "start": "0x2102F78", 166 | "suffix": " Medals" 167 | } 168 | } 169 | ], 170 | "checksum16": [ 171 | { 172 | "start": "0x2102E80", 173 | "length": 30, 174 | "label": "Grand Champion" 175 | }, 176 | { 177 | "start": "0x2102EA0", 178 | "length": 30, 179 | "label": "High Score #1" 180 | }, 181 | { 182 | "start": "0x2102EC0", 183 | "length": 30, 184 | "label": "High Score #2" 185 | }, 186 | { 187 | "start": "0x2102EE0", 188 | "length": 30, 189 | "label": "High Score #3" 190 | }, 191 | { 192 | "start": "0x2102F00", 193 | "length": 30, 194 | "label": "High Score #4" 195 | }, 196 | { 197 | "start": "0x2102F20", 198 | "length": 30, 199 | "label": "Combo Champion" 200 | }, 201 | { 202 | "start": "0x2102F40", 203 | "length": 30, 204 | "label": "Warp Champion" 205 | }, 206 | { 207 | "start": "0x2102F60", 208 | "length": 30, 209 | "label": "Medals Champion" 210 | } 211 | ] 212 | } 213 | -------------------------------------------------------------------------------- /maps/stern/sam/st_162h.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins, based on st_162h by HorsePin" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C)2024 by Tom Collins ", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "stern-sam", 14 | "roms": [ 15 | "st_162h" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "int", 23 | "length": 4, 24 | "start": "0x2110A0C" 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "int", 29 | "length": 4, 30 | "start": "0x2110A10" 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "int", 35 | "length": 4, 36 | "start": "0x2110A14" 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "int", 41 | "length": 4, 42 | "start": "0x2110A18" 43 | } 44 | ] 45 | }, 46 | "high_scores": [ 47 | { 48 | "label": "Grand Champion", 49 | "short_label": "GC", 50 | "initials": { 51 | "encoding": "ch", 52 | "null": "terminate", 53 | "length": 11, 54 | "start": "0x2102ED0" 55 | }, 56 | "score": { 57 | "encoding": "int", 58 | "length": 4, 59 | "start": "0x2102EE8" 60 | } 61 | }, 62 | { 63 | "label": "High Score #1", 64 | "short_label": "#1", 65 | "initials": { 66 | "encoding": "ch", 67 | "null": "terminate", 68 | "length": 11, 69 | "start": "0x2102EF0" 70 | }, 71 | "score": { 72 | "encoding": "int", 73 | "length": 4, 74 | "start": "0x2102F08" 75 | } 76 | }, 77 | { 78 | "label": "High Score #2", 79 | "short_label": "#2", 80 | "initials": { 81 | "encoding": "ch", 82 | "null": "terminate", 83 | "length": 11, 84 | "start": "0x2102F10" 85 | }, 86 | "score": { 87 | "encoding": "int", 88 | "length": 4, 89 | "start": "0x2102F28" 90 | } 91 | }, 92 | { 93 | "label": "High Score #3", 94 | "short_label": "#3", 95 | "initials": { 96 | "encoding": "ch", 97 | "null": "terminate", 98 | "length": 11, 99 | "start": "0x2102F30" 100 | }, 101 | "score": { 102 | "encoding": "int", 103 | "length": 4, 104 | "start": "0x2102F48" 105 | } 106 | }, 107 | { 108 | "label": "High Score #4", 109 | "short_label": "#4", 110 | "initials": { 111 | "encoding": "ch", 112 | "null": "terminate", 113 | "length": 11, 114 | "start": "0x2102F50" 115 | }, 116 | "score": { 117 | "encoding": "int", 118 | "length": 4, 119 | "start": "0x2102F68" 120 | } 121 | } 122 | ], 123 | "mode_champions": [ 124 | { 125 | "label": "Combo Champion", 126 | "initials": { 127 | "encoding": "ch", 128 | "null": "terminate", 129 | "length": 11, 130 | "start": "0x2102F70" 131 | }, 132 | "score": { 133 | "encoding": "int", 134 | "length": 4, 135 | "start": "0x2102F88", 136 | "suffix": " Combos" 137 | } 138 | }, 139 | { 140 | "label": "Warp Champion", 141 | "initials": { 142 | "encoding": "ch", 143 | "null": "terminate", 144 | "length": 11, 145 | "start": "0x2102F90" 146 | }, 147 | "score": { 148 | "encoding": "int", 149 | "length": 4, 150 | "start": "0x2102FA8", 151 | "suffix": " Warps" 152 | } 153 | }, 154 | { 155 | "label": "Medals Champion", 156 | "initials": { 157 | "encoding": "ch", 158 | "null": "terminate", 159 | "length": 11, 160 | "start": "0x2102FB0" 161 | }, 162 | "score": { 163 | "encoding": "int", 164 | "length": 4, 165 | "start": "0x2102FC8", 166 | "suffix": " Medals" 167 | } 168 | } 169 | ], 170 | "checksum16": [ 171 | { 172 | "start": "0x2102ED0", 173 | "length": 30, 174 | "label": "Grand Champion" 175 | }, 176 | { 177 | "start": "0x2102EF0", 178 | "length": 30, 179 | "label": "High Score #1" 180 | }, 181 | { 182 | "start": "0x2102F10", 183 | "length": 30, 184 | "label": "High Score #2" 185 | }, 186 | { 187 | "start": "0x2102F30", 188 | "length": 30, 189 | "label": "High Score #3" 190 | }, 191 | { 192 | "start": "0x2102F50", 193 | "length": 30, 194 | "label": "High Score #4" 195 | }, 196 | { 197 | "start": "0x2102F70", 198 | "length": 30, 199 | "label": "Combo Champion" 200 | }, 201 | { 202 | "start": "0x2102F90", 203 | "length": 30, 204 | "label": "Warp Champion" 205 | }, 206 | { 207 | "start": "0x2102FB0", 208 | "length": 30, 209 | "label": "Medals Champion" 210 | } 211 | ] 212 | } 213 | -------------------------------------------------------------------------------- /maps/dataeast/version3/btmn_106.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Originally compiled by Horsepin. Updated by Tom Collins" 4 | ], 5 | "_fileformat": 0.8, 6 | "_metadata": { 7 | "version": 2, 8 | "copyright": [ 9 | "Copyright (C) 2016 by Dave horsepin ", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "dataeast", 14 | "roms": [ 15 | "btmn_106" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "bcd", 23 | "offsets": [ 24 | "0x20", 25 | "0x10", 26 | "0x11", 27 | "0x12", 28 | "0x13" 29 | ] 30 | }, 31 | { 32 | "label": "Player 2", 33 | "encoding": "bcd", 34 | "offsets": [ 35 | "0x21", 36 | "0x14", 37 | "0x15", 38 | "0x16", 39 | "0x17" 40 | ] 41 | }, 42 | { 43 | "label": "Player 3", 44 | "encoding": "bcd", 45 | "offsets": [ 46 | "0x22", 47 | "0x18", 48 | "0x19", 49 | "0x1A", 50 | "0x1B" 51 | ] 52 | }, 53 | { 54 | "label": "Player 4", 55 | "encoding": "bcd", 56 | "offsets": [ 57 | "0x23", 58 | "0x1C", 59 | "0x1D", 60 | "0x1E", 61 | "0x1F" 62 | ] 63 | } 64 | ], 65 | "credits": { 66 | "label": "Credits", 67 | "start": "0x1DDE", 68 | "encoding": "bcd" 69 | }, 70 | "free_play": { 71 | "label": "Free Play", 72 | "start": "0x1E04", 73 | "encoding": "bool" 74 | }, 75 | "max_credits": { 76 | "label": "Max Credits", 77 | "start": "0x1E0F", 78 | "encoding": "bcd" 79 | }, 80 | "player_count": { 81 | "label": "Player Count", 82 | "start": "0x87", 83 | "encoding": "int" 84 | }, 85 | "ball_count": { 86 | "label": "Ball Count", 87 | "start": "0x1E0D", 88 | "encoding": "bcd" 89 | }, 90 | "current_player": { 91 | "label": "Player", 92 | "start": "0x86", 93 | "encoding": "int" 94 | }, 95 | "current_ball": { 96 | "label": "Ball", 97 | "start": "0x4E", 98 | "encoding": "int" 99 | }, 100 | "game_over": { 101 | "_notes": "game is over if current player/ball is 0", 102 | "label": "Game Over", 103 | "start": "0x86", 104 | "encoding": "bool", 105 | "invert": true 106 | } 107 | }, 108 | "high_scores": [ 109 | { 110 | "label": "First", 111 | "short_label": "#1", 112 | "initials": { 113 | "start": "0x1DCA", 114 | "encoding": "ch", 115 | "length": 3 116 | }, 117 | "score": { 118 | "encoding": "bcd", 119 | "offsets": [ 120 | "0x1DB0", 121 | "0x1D98", 122 | "0x1D99", 123 | "0x1D9A", 124 | "0x1D9B" 125 | ] 126 | } 127 | }, 128 | { 129 | "label": "Second", 130 | "short_label": "#2", 131 | "initials": { 132 | "start": "0x1DCD", 133 | "encoding": "ch", 134 | "length": 3 135 | }, 136 | "score": { 137 | "encoding": "bcd", 138 | "offsets": [ 139 | "0x1DB1", 140 | "0x1D9C", 141 | "0x1D9D", 142 | "0x1D9E", 143 | "0x1D9F" 144 | ] 145 | } 146 | }, 147 | { 148 | "label": "Third", 149 | "short_label": "#3", 150 | "initials": { 151 | "start": "0x1DD0", 152 | "encoding": "ch", 153 | "length": 3 154 | }, 155 | "score": { 156 | "encoding": "bcd", 157 | "offsets": [ 158 | "0x1DB2", 159 | "0x1DA0", 160 | "0x1DA1", 161 | "0x1DA2", 162 | "0x1DA3" 163 | ] 164 | } 165 | }, 166 | { 167 | "label": "Fourth", 168 | "short_label": "#4", 169 | "initials": { 170 | "start": "0x1DD3", 171 | "encoding": "ch", 172 | "length": 3 173 | }, 174 | "score": { 175 | "encoding": "bcd", 176 | "offsets": [ 177 | "0x1DB3", 178 | "0x1DA4", 179 | "0x1DA5", 180 | "0x1DA6", 181 | "0x1DA7" 182 | ] 183 | } 184 | }, 185 | { 186 | "label": "Fifth", 187 | "short_label": "#5", 188 | "initials": { 189 | "start": "0x1DD6", 190 | "encoding": "ch", 191 | "length": 3 192 | }, 193 | "score": { 194 | "encoding": "bcd", 195 | "offsets": [ 196 | "0x1DB4", 197 | "0x1DA8", 198 | "0x1DA9", 199 | "0x1DAA", 200 | "0x1DAB" 201 | ] 202 | } 203 | }, 204 | { 205 | "label": "Sixth", 206 | "short_label": "#6", 207 | "initials": { 208 | "start": "0x1DD9", 209 | "encoding": "ch", 210 | "length": 3 211 | }, 212 | "score": { 213 | "encoding": "bcd", 214 | "offsets": [ 215 | "0x1DB5", 216 | "0x1DAC", 217 | "0x1DAD", 218 | "0x1DAE", 219 | "0x1DAF" 220 | ] 221 | } 222 | } 223 | ] 224 | } 225 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/kissc.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "KISS (Bally 1979)", 5 | "https://www.ipdb.org/machine.cgi?id=1386", 6 | "https://opdb.org/machines/1225", 7 | "Bally MPU AS-2518-35", 8 | "rev. 3 6-digit score display" 9 | ], 10 | "_fileformat": 0.8, 11 | "_metadata": { 12 | "version": 2, 13 | "copyright": [ 14 | "Copyright (C) 2024 by Francis De Brabandere ", 15 | "Copyright (C) 2025 by Tom Collins " 16 | ], 17 | "license": "GNU Lesser General Public License v3.0", 18 | "platform": "bally-35-8K", 19 | "roms": [ 20 | "kissc" 21 | ] 22 | }, 23 | "game_state": { 24 | "credits": { 25 | "label": "Credits", 26 | "start": "0x02D5", 27 | "length": 2, 28 | "encoding": "bcd" 29 | }, 30 | "scores": [ 31 | { 32 | "label": "Player 1", 33 | "start": "0x021E", 34 | "encoding": "bcd", 35 | "length": 6 36 | }, 37 | { 38 | "label": "Player 2", 39 | "start": "0x0224", 40 | "encoding": "bcd", 41 | "length": 6 42 | }, 43 | { 44 | "label": "Player 3", 45 | "start": "0x022A", 46 | "encoding": "bcd", 47 | "length": 6 48 | }, 49 | { 50 | "label": "Player 4", 51 | "start": "0x0230", 52 | "encoding": "bcd", 53 | "length": 6 54 | } 55 | ], 56 | "final_scores": [ 57 | { 58 | "label": "Final P1", 59 | "start": "0x023C", 60 | "encoding": "bcd", 61 | "length": 6 62 | }, 63 | { 64 | "label": "Final P2", 65 | "start": "0x0242", 66 | "encoding": "bcd", 67 | "length": 6 68 | }, 69 | { 70 | "label": "Final P3", 71 | "start": "0x0248", 72 | "encoding": "bcd", 73 | "length": 6 74 | }, 75 | { 76 | "label": "Final P4", 77 | "start": "0x024E", 78 | "encoding": "bcd", 79 | "length": 6 80 | } 81 | ], 82 | "current_ball": { 83 | "label": "Current Ball", 84 | "start": "0x12", 85 | "encoding": "bcd" 86 | }, 87 | "player_count": { 88 | "label": "Players", 89 | "start": "0x13", 90 | "encoding": "bcd" 91 | }, 92 | "current_player": { 93 | "label": "Current Player", 94 | "start": "0x14", 95 | "encoding": "bcd" 96 | }, 97 | "ball_count": { 98 | "label": "Ball Count", 99 | "encoding": "dipsw", 100 | "offsets": [ 101 | 16 102 | ], 103 | "values": [ 104 | 3, 105 | 5 106 | ] 107 | }, 108 | "max_credits": { 109 | "label": "Max Credits", 110 | "encoding": "dipsw", 111 | "offsets": [ 112 | 19, 113 | 18, 114 | 17 115 | ], 116 | "values": [ 117 | 5, 118 | 10, 119 | 15, 120 | 20, 121 | 25, 122 | 30, 123 | 35, 124 | 40 125 | ] 126 | }, 127 | "game_over": { 128 | "_notes": "reading 'game over' lamp", 129 | "label": "Game Over", 130 | "start": "0x20C", 131 | "encoding": "bool", 132 | "mask": "0x4", 133 | "invert": true 134 | }, 135 | "tilted": { 136 | "_notes": "reading 'tilt' lamp", 137 | "label": "Tilted", 138 | "start": "0x20C", 139 | "encoding": "bool", 140 | "mask": "0x8", 141 | "invert": true 142 | } 143 | }, 144 | "high_scores": [ 145 | { 146 | "label": "High Score", 147 | "short_label": "HS", 148 | "score": { 149 | "start": "0x02CF", 150 | "encoding": "bcd", 151 | "length": 6 152 | } 153 | } 154 | ], 155 | "audits": { 156 | "Bookkeeping functions": { 157 | "05": { 158 | "label": "Current Credits", 159 | "start": "0x02D5", 160 | "length": 6, 161 | "encoding": "bcd", 162 | "min": 0, 163 | "max": 40 164 | }, 165 | "06": { 166 | "label": "Total Plays (Paid and Free Games)", 167 | "start": "0x02DB", 168 | "length": 6, 169 | "encoding": "bcd", 170 | "min": 0, 171 | "max": 999999 172 | }, 173 | "07": { 174 | "label": "Total Replays (Free Games)", 175 | "start": "0x02E1", 176 | "length": 6, 177 | "encoding": "bcd", 178 | "min": 0, 179 | "max": 999999 180 | }, 181 | "08": { 182 | "label": "HSTD Achieved", 183 | "start": "0x02E7", 184 | "length": 6, 185 | "encoding": "bcd", 186 | "min": 0, 187 | "max": 999999 188 | }, 189 | "09": { 190 | "label": "Coin Chute #1", 191 | "start": "0x02ED", 192 | "length": 6, 193 | "encoding": "bcd", 194 | "min": 0, 195 | "max": 999999 196 | }, 197 | "10": { 198 | "label": "Coin Chute #2", 199 | "start": "0x02F3", 200 | "length": 6, 201 | "encoding": "bcd", 202 | "min": 0, 203 | "max": 999999 204 | }, 205 | "11": { 206 | "label": "Coin Chute #3", 207 | "start": "0x02F9", 208 | "length": 6, 209 | "encoding": "bcd", 210 | "min": 0, 211 | "max": 999999 212 | } 213 | } 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /maps/dataeast/version3/tomy_400.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Originally compiled by Horsepin.", 4 | "Updated from gnr_300 by Tom Collins" 5 | ], 6 | "_fileformat": 0.8, 7 | "_metadata": { 8 | "version": 3, 9 | "copyright": [ 10 | "Copyright (C) 2016 by Horsepin>", 11 | "Copyright (C) 2025 by Tom Collins " 12 | ], 13 | "license": "GNU Lesser General Public License v3.0", 14 | "platform": "dataeast", 15 | "roms": [ 16 | "tomy_400", 17 | "tomy_500" 18 | ] 19 | }, 20 | "game_state": { 21 | "scores": [ 22 | { 23 | "label": "Player 1", 24 | "encoding": "bcd", 25 | "offsets": [ 26 | "0x16E6", 27 | "0x16D6", 28 | "0x16D7", 29 | "0x16D8", 30 | "0x16D9" 31 | ] 32 | }, 33 | { 34 | "label": "Player 2", 35 | "encoding": "bcd", 36 | "offsets": [ 37 | "0x16E7", 38 | "0x16DA", 39 | "0x16DB", 40 | "0x16DC", 41 | "0x16DD" 42 | ] 43 | }, 44 | { 45 | "label": "Player 3", 46 | "encoding": "bcd", 47 | "offsets": [ 48 | "0x16E8", 49 | "0x16DE", 50 | "0x16DF", 51 | "0x16E0", 52 | "0x16E1" 53 | ] 54 | }, 55 | { 56 | "label": "Player 4", 57 | "encoding": "bcd", 58 | "offsets": [ 59 | "0x16E9", 60 | "0x16E2", 61 | "0x16E3", 62 | "0x16E4", 63 | "0x16E5" 64 | ] 65 | } 66 | ], 67 | "credits": { 68 | "label": "Credits", 69 | "start": "0x16CE", 70 | "encoding": "bcd" 71 | }, 72 | "free_play": { 73 | "label": "Free Play", 74 | "start": "0x1E04", 75 | "encoding": "bool" 76 | }, 77 | "max_credits": { 78 | "label": "Max Credits", 79 | "start": "0x1E0F", 80 | "encoding": "bcd" 81 | }, 82 | "player_count": { 83 | "label": "Player Count", 84 | "start": "0x1B5", 85 | "encoding": "int" 86 | }, 87 | "ball_count": { 88 | "label": "Ball Count", 89 | "start": "0x1E0D", 90 | "encoding": "bcd" 91 | }, 92 | "current_player": { 93 | "label": "Player", 94 | "start": "0x1B2", 95 | "encoding": "int" 96 | }, 97 | "current_ball": { 98 | "label": "Ball", 99 | "start": "0x1B3", 100 | "encoding": "int" 101 | }, 102 | "game_over": { 103 | "_notes": "game is over if current player/ball is 0", 104 | "label": "Game Over", 105 | "start": "0x1B2", 106 | "encoding": "bool", 107 | "invert": true 108 | } 109 | }, 110 | "high_scores": [ 111 | { 112 | "label": "First", 113 | "short_label": "#1", 114 | "initials": { 115 | "start": "0x16BA", 116 | "encoding": "ch", 117 | "length": 3 118 | }, 119 | "score": { 120 | "encoding": "bcd", 121 | "offsets": [ 122 | "0x1694", 123 | "0x167C", 124 | "0x167D", 125 | "0x167E", 126 | "0x167F" 127 | ] 128 | } 129 | }, 130 | { 131 | "label": "Second", 132 | "short_label": "#2", 133 | "initials": { 134 | "start": "0x16BD", 135 | "encoding": "ch", 136 | "length": 3 137 | }, 138 | "score": { 139 | "encoding": "bcd", 140 | "offsets": [ 141 | "0x1695", 142 | "0x1680", 143 | "0x1681", 144 | "0x1682", 145 | "0x1683" 146 | ] 147 | } 148 | }, 149 | { 150 | "label": "Third", 151 | "short_label": "#3", 152 | "initials": { 153 | "start": "0x16C0", 154 | "encoding": "ch", 155 | "length": 3 156 | }, 157 | "score": { 158 | "encoding": "bcd", 159 | "offsets": [ 160 | "0x1696", 161 | "0x1684", 162 | "0x1685", 163 | "0x1686", 164 | "0x1687" 165 | ] 166 | } 167 | }, 168 | { 169 | "label": "Fourth", 170 | "short_label": "#4", 171 | "initials": { 172 | "start": "0x16C3", 173 | "encoding": "ch", 174 | "length": 3 175 | }, 176 | "score": { 177 | "encoding": "bcd", 178 | "offsets": [ 179 | "0x1697", 180 | "0x1688", 181 | "0x1689", 182 | "0x168A", 183 | "0x168B" 184 | ] 185 | } 186 | }, 187 | { 188 | "label": "Fifth", 189 | "short_label": "#5", 190 | "initials": { 191 | "start": "0x16C6", 192 | "encoding": "ch", 193 | "length": 3 194 | }, 195 | "score": { 196 | "encoding": "bcd", 197 | "offsets": [ 198 | "0x1698", 199 | "0x168C", 200 | "0x168D", 201 | "0x168E", 202 | "0x168F" 203 | ] 204 | } 205 | }, 206 | { 207 | "label": "Sixth", 208 | "short_label": "#6", 209 | "initials": { 210 | "start": "0x16C9", 211 | "encoding": "ch", 212 | "length": 3 213 | }, 214 | "score": { 215 | "encoding": "bcd", 216 | "offsets": [ 217 | "0x1699", 218 | "0x1690", 219 | "0x1691", 220 | "0x1692", 221 | "0x1693" 222 | ] 223 | } 224 | } 225 | ] 226 | } 227 | -------------------------------------------------------------------------------- /maps/stern/sam/tf_180.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by HorsePin" 4 | ], 5 | "_fileformat": 0.7, 6 | "_metadata": { 7 | "version": 1, 8 | "copyright": [ 9 | "Copyright (C) 2022 https://github.com/horseyhorsey", 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "stern-sam", 14 | "roms": [ 15 | "tf_180" 16 | ] 17 | }, 18 | "game_state": { 19 | "scores": [ 20 | { 21 | "label": "Player 1", 22 | "encoding": "int", 23 | "length": 4, 24 | "start": "0x21109E4" 25 | }, 26 | { 27 | "label": "Player 2", 28 | "encoding": "int", 29 | "length": 4, 30 | "start": "0x21109E8" 31 | }, 32 | { 33 | "label": "Player 3", 34 | "encoding": "int", 35 | "length": 4, 36 | "start": "0x21109EC" 37 | }, 38 | { 39 | "label": "Player 4", 40 | "encoding": "int", 41 | "length": 4, 42 | "start": "0x21109F0" 43 | } 44 | ] 45 | }, 46 | "high_scores": [ 47 | { 48 | "label": "Autobot Grand Champion", 49 | "short_label": "AGC", 50 | "initials": { 51 | "start": "0x2102DC8", 52 | "encoding": "ch", 53 | "length": 3 54 | }, 55 | "score": { 56 | "encoding": "int", 57 | "length": 4, 58 | "start": "0x2102DE0" 59 | } 60 | }, 61 | { 62 | "label": "Autobot #1", 63 | "short_label": "A#1", 64 | "initials": { 65 | "start": "0x2102DE8", 66 | "encoding": "ch", 67 | "length": 3 68 | }, 69 | "score": { 70 | "encoding": "int", 71 | "length": 4, 72 | "start": "0x2102E00" 73 | } 74 | }, 75 | { 76 | "label": "Autobot #2", 77 | "short_label": "A#2", 78 | "initials": { 79 | "start": "0x2102E08", 80 | "encoding": "ch", 81 | "length": 3 82 | }, 83 | "score": { 84 | "encoding": "int", 85 | "length": 4, 86 | "start": "0x2102E20" 87 | } 88 | }, 89 | { 90 | "label": "Autobot #3", 91 | "short_label": "A#3", 92 | "initials": { 93 | "start": "0x2102E28", 94 | "encoding": "ch", 95 | "length": 3 96 | }, 97 | "score": { 98 | "encoding": "int", 99 | "length": 4, 100 | "start": "0x2102E40" 101 | } 102 | }, 103 | { 104 | "label": "Autobot #4", 105 | "short_label": "A#4", 106 | "initials": { 107 | "start": "0x2102E48", 108 | "encoding": "ch", 109 | "length": 3 110 | }, 111 | "score": { 112 | "encoding": "int", 113 | "length": 4, 114 | "start": "0x2102E60" 115 | } 116 | }, 117 | { 118 | "label": "Decepticon Grand Champion", 119 | "short_label": "DGC", 120 | "initials": { 121 | "start": "0x2102E68", 122 | "encoding": "ch", 123 | "length": 3 124 | }, 125 | "score": { 126 | "encoding": "int", 127 | "length": 4, 128 | "start": "0x2102E80" 129 | } 130 | }, 131 | { 132 | "label": "Decepticon #1", 133 | "short_label": "D#1", 134 | "initials": { 135 | "start": "0x2102E88", 136 | "encoding": "ch", 137 | "length": 3 138 | }, 139 | "score": { 140 | "encoding": "int", 141 | "length": 4, 142 | "start": "0x2102EA0" 143 | } 144 | }, 145 | { 146 | "label": "Decepticon #2", 147 | "short_label": "D#2", 148 | "initials": { 149 | "start": "0x2102EA8", 150 | "encoding": "ch", 151 | "length": 3 152 | }, 153 | "score": { 154 | "encoding": "int", 155 | "length": 4, 156 | "start": "0x2102EC0" 157 | } 158 | }, 159 | { 160 | "label": "Decepticon #3", 161 | "short_label": "D#3", 162 | "initials": { 163 | "start": "0x2102EC8", 164 | "encoding": "ch", 165 | "length": 3 166 | }, 167 | "score": { 168 | "encoding": "int", 169 | "length": 4, 170 | "start": "0x2102EE0" 171 | } 172 | }, 173 | { 174 | "label": "Decepticon #4", 175 | "short_label": "D#4", 176 | "initials": { 177 | "start": "0x2102EE8", 178 | "encoding": "ch", 179 | "length": 3 180 | }, 181 | "score": { 182 | "encoding": "int", 183 | "length": 4, 184 | "start": "0x2102F00" 185 | } 186 | } 187 | ], 188 | "mode_champions": [ 189 | { 190 | "label": "Combo", 191 | "short_label": "Combo", 192 | "initials": { 193 | "start": "0x2102F08", 194 | "encoding": "ch", 195 | "length": 3 196 | }, 197 | "score": { 198 | "start": "0x2102F20", 199 | "encoding": "int", 200 | "length": 4 201 | } 202 | }, 203 | { 204 | "label": "Best Combo Champion", 205 | "short_label": "Best Combo", 206 | "initials": { 207 | "start": "0x2102F28", 208 | "encoding": "ch", 209 | "length": 3 210 | }, 211 | "score": { 212 | "start": "0x2102F40", 213 | "encoding": "int", 214 | "length": 4, 215 | "suffix": "-WAY" 216 | } 217 | } 218 | ] 219 | } 220 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/lostwrld.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Lost World (Bally 1978)", 5 | "https://www.ipdb.org/machine.cgi?id=1476", 6 | "https://opdb.org/machines/947", 7 | "Bally MPU AS-2518-35 (U6: 720-28_6.716)", 8 | "6-digit score display", 9 | "By default the credits are not shown, set dip switch 27 to show them." 10 | ], 11 | "_fileformat": 0.8, 12 | "_metadata": { 13 | "version": 2, 14 | "copyright": [ 15 | "Copyright (C) 2024 by Francis De Brabandere ", 16 | "Copyright (C) 2025 by Tom Collins " 17 | ], 18 | "license": "GNU Lesser General Public License v3.0", 19 | "platform": "bally-35-6K", 20 | "roms": [ 21 | "lostwrld" 22 | ] 23 | }, 24 | "game_state": { 25 | "credits": { 26 | "label": "Credits", 27 | "start": "0x02D5", 28 | "length": 2, 29 | "encoding": "bcd" 30 | }, 31 | "scores": [ 32 | { 33 | "label": "Player 1", 34 | "start": "0x021E", 35 | "encoding": "bcd", 36 | "length": 6 37 | }, 38 | { 39 | "label": "Player 2", 40 | "start": "0x0224", 41 | "encoding": "bcd", 42 | "length": 6 43 | }, 44 | { 45 | "label": "Player 3", 46 | "start": "0x022A", 47 | "encoding": "bcd", 48 | "length": 6 49 | }, 50 | { 51 | "label": "Player 4", 52 | "start": "0x0230", 53 | "encoding": "bcd", 54 | "length": 6 55 | } 56 | ], 57 | "final_scores": [ 58 | { 59 | "label": "Final P1", 60 | "start": "0x023C", 61 | "encoding": "bcd", 62 | "length": 6 63 | }, 64 | { 65 | "label": "Final P2", 66 | "start": "0x0242", 67 | "encoding": "bcd", 68 | "length": 6 69 | }, 70 | { 71 | "label": "Final P3", 72 | "start": "0x0248", 73 | "encoding": "bcd", 74 | "length": 6 75 | }, 76 | { 77 | "label": "Final P4", 78 | "start": "0x024E", 79 | "encoding": "bcd", 80 | "length": 6 81 | } 82 | ], 83 | "current_ball": { 84 | "label": "Current Ball", 85 | "start": "0x12", 86 | "encoding": "bcd" 87 | }, 88 | "player_count": { 89 | "label": "Players", 90 | "start": "0x13", 91 | "encoding": "bcd" 92 | }, 93 | "current_player": { 94 | "label": "Current Player", 95 | "start": "0x14", 96 | "encoding": "bcd" 97 | }, 98 | "ball_count": { 99 | "label": "Ball Count", 100 | "encoding": "dipsw", 101 | "offsets": [ 102 | 16 103 | ], 104 | "values": [ 105 | 3, 106 | 5 107 | ] 108 | }, 109 | "max_credits": { 110 | "label": "Max Credits", 111 | "encoding": "dipsw", 112 | "offsets": [ 113 | 19, 114 | 18, 115 | 17 116 | ], 117 | "values": [ 118 | 5, 119 | 10, 120 | 15, 121 | 20, 122 | 25, 123 | 30, 124 | 35, 125 | 40 126 | ] 127 | }, 128 | "game_over": { 129 | "_notes": "reading 'game over' lamp", 130 | "label": "Game Over", 131 | "start": "0x20C", 132 | "encoding": "bool", 133 | "mask": "0x4", 134 | "invert": true 135 | }, 136 | "tilted": { 137 | "_notes": "reading 'tilt' lamp", 138 | "label": "Tilted", 139 | "start": "0x20C", 140 | "encoding": "bool", 141 | "mask": "0x8", 142 | "invert": true 143 | } 144 | }, 145 | "high_scores": [ 146 | { 147 | "label": "High Score", 148 | "short_label": "HS", 149 | "score": { 150 | "start": "0x02CF", 151 | "encoding": "bcd", 152 | "length": 6 153 | } 154 | } 155 | ], 156 | "audits": { 157 | "Bookkeeping functions": { 158 | "05": { 159 | "label": "Current Credits", 160 | "start": "0x02D5", 161 | "length": 6, 162 | "encoding": "bcd", 163 | "min": 0, 164 | "max": 40 165 | }, 166 | "06": { 167 | "label": "Total Plays (Paid and Free Games)", 168 | "start": "0x02DB", 169 | "length": 6, 170 | "encoding": "bcd", 171 | "min": 0, 172 | "max": 999999 173 | }, 174 | "07": { 175 | "label": "Total Replays (Free Games)", 176 | "start": "0x02E1", 177 | "length": 6, 178 | "encoding": "bcd", 179 | "min": 0, 180 | "max": 999999 181 | }, 182 | "08": { 183 | "label": "HSTD Achieved", 184 | "start": "0x02E7", 185 | "length": 6, 186 | "encoding": "bcd", 187 | "min": 0, 188 | "max": 999999 189 | }, 190 | "09": { 191 | "label": "Coin Chute #1", 192 | "start": "0x02ED", 193 | "length": 6, 194 | "encoding": "bcd", 195 | "min": 0, 196 | "max": 999999 197 | }, 198 | "10": { 199 | "label": "Coin Chute #2", 200 | "start": "0x02F3", 201 | "length": 6, 202 | "encoding": "bcd", 203 | "min": 0, 204 | "max": 999999 205 | }, 206 | "11": { 207 | "label": "Coin Chute #3", 208 | "start": "0x02F9", 209 | "length": 6, 210 | "encoding": "bcd", 211 | "min": 0, 212 | "max": 999999 213 | } 214 | } 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /maps/dataeast/version3/gnr_300.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Guns N' Roses (Data East 1994)", 4 | "IPDB: 1100, OPDB: GrPKV-MyNoP (1883)", 5 | "Compiled by Tom Collins ", 6 | "Using `offsets` since top byte (two digits) of each score is stored separately." 7 | ], 8 | "_fileformat": 0.8, 9 | "_metadata": { 10 | "version": 2, 11 | "copyright": [ 12 | "Copyright (C) 2025 by Tom Collins " 13 | ], 14 | "license": "GNU Lesser General Public License v3.0", 15 | "platform": "dataeast", 16 | "roms": [ 17 | "gnr_300", 18 | "gnr_300d", 19 | "gnr_300f" 20 | ] 21 | }, 22 | "game_state": { 23 | "scores": [ 24 | { 25 | "label": "Player 1", 26 | "encoding": "bcd", 27 | "offsets": [ 28 | "0x16E6", 29 | "0x16D6", 30 | "0x16D7", 31 | "0x16D8", 32 | "0x16D9" 33 | ] 34 | }, 35 | { 36 | "label": "Player 2", 37 | "encoding": "bcd", 38 | "offsets": [ 39 | "0x16E7", 40 | "0x16DA", 41 | "0x16DB", 42 | "0x16DC", 43 | "0x16DD" 44 | ] 45 | }, 46 | { 47 | "label": "Player 3", 48 | "encoding": "bcd", 49 | "offsets": [ 50 | "0x16E8", 51 | "0x16DE", 52 | "0x16DF", 53 | "0x16E0", 54 | "0x16E1" 55 | ] 56 | }, 57 | { 58 | "label": "Player 4", 59 | "encoding": "bcd", 60 | "offsets": [ 61 | "0x16E9", 62 | "0x16E2", 63 | "0x16E3", 64 | "0x16E4", 65 | "0x16E5" 66 | ] 67 | } 68 | ], 69 | "credits": { 70 | "label": "Credits", 71 | "start": "0x16CE", 72 | "encoding": "bcd" 73 | }, 74 | "free_play": { 75 | "label": "Free Play", 76 | "start": "0x1E04", 77 | "encoding": "bool" 78 | }, 79 | "max_credits": { 80 | "label": "Max Credits", 81 | "start": "0x1E0F", 82 | "encoding": "bcd" 83 | }, 84 | "player_count": { 85 | "label": "Player Count", 86 | "start": "0x1BE", 87 | "encoding": "int" 88 | }, 89 | "ball_count": { 90 | "label": "Ball Count", 91 | "start": "0x1E0D", 92 | "encoding": "bcd" 93 | }, 94 | "current_player": { 95 | "label": "Player", 96 | "start": "0x1BB", 97 | "encoding": "int" 98 | }, 99 | "current_ball": { 100 | "label": "Ball", 101 | "start": "0x1BC", 102 | "encoding": "int" 103 | }, 104 | "game_over": { 105 | "_notes": "game is over if current player/ball is 0", 106 | "label": "Game Over", 107 | "start": "0x1BB", 108 | "encoding": "bool", 109 | "invert": true 110 | } 111 | }, 112 | "high_scores": [ 113 | { 114 | "label": "#1 Producer", 115 | "short_label": "#1", 116 | "initials": { 117 | "start": "0x16BA", 118 | "encoding": "ch", 119 | "length": 3 120 | }, 121 | "score": { 122 | "encoding": "bcd", 123 | "offsets": [ 124 | "0x1694", 125 | "0x167C", 126 | "0x167D", 127 | "0x167E", 128 | "0x167F" 129 | ] 130 | } 131 | }, 132 | { 133 | "label": "#2 Promoter", 134 | "short_label": "#2", 135 | "initials": { 136 | "start": "0x16BD", 137 | "encoding": "ch", 138 | "length": 3 139 | }, 140 | "score": { 141 | "encoding": "bcd", 142 | "offsets": [ 143 | "0x1695", 144 | "0x1680", 145 | "0x1681", 146 | "0x1682", 147 | "0x1683" 148 | ] 149 | } 150 | }, 151 | { 152 | "label": "#3 Security", 153 | "short_label": "#3", 154 | "initials": { 155 | "start": "0x16C0", 156 | "encoding": "ch", 157 | "length": 3 158 | }, 159 | "score": { 160 | "encoding": "bcd", 161 | "offsets": [ 162 | "0x1696", 163 | "0x1684", 164 | "0x1685", 165 | "0x1686", 166 | "0x1687" 167 | ] 168 | } 169 | }, 170 | { 171 | "label": "#4 Roadie", 172 | "short_label": "#4", 173 | "initials": { 174 | "start": "0x16C3", 175 | "encoding": "ch", 176 | "length": 3 177 | }, 178 | "score": { 179 | "encoding": "bcd", 180 | "offsets": [ 181 | "0x1697", 182 | "0x1688", 183 | "0x1689", 184 | "0x168A", 185 | "0x168B" 186 | ] 187 | } 188 | }, 189 | { 190 | "label": "#5 Groupie", 191 | "short_label": "#5", 192 | "initials": { 193 | "start": "0x16C6", 194 | "encoding": "ch", 195 | "length": 3 196 | }, 197 | "score": { 198 | "encoding": "bcd", 199 | "offsets": [ 200 | "0x1698", 201 | "0x168C", 202 | "0x168D", 203 | "0x168E", 204 | "0x168F" 205 | ] 206 | } 207 | }, 208 | { 209 | "label": "#6 Fan", 210 | "short_label": "#6", 211 | "initials": { 212 | "start": "0x16C9", 213 | "encoding": "ch", 214 | "length": 3 215 | }, 216 | "score": { 217 | "encoding": "bcd", 218 | "offsets": [ 219 | "0x1699", 220 | "0x1690", 221 | "0x1691", 222 | "0x1692", 223 | "0x1693" 224 | ] 225 | } 226 | } 227 | ] 228 | } 229 | -------------------------------------------------------------------------------- /maps/dataeast/version3/trek_201.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Created by Tom Collins, based on btmn_106 (by Dave horsepin/Tom Collins)", 4 | "High Scores for trek_110/trek_11a: Initials -0x1F, scores -0x20" 5 | ], 6 | "_fileformat": 0.8, 7 | "_metadata": { 8 | "version": 2, 9 | "copyright": [ 10 | "Copyright (C) 2016 by Dave horsepin ", 11 | "Copyright (C) 2025 by Tom Collins " 12 | ], 13 | "license": "GNU Lesser General Public License v3.0", 14 | "platform": "dataeast", 15 | "roms": [ 16 | "trek_117", 17 | "trek_120", 18 | "trek_200", 19 | "trek_201", 20 | "trek_300" 21 | ] 22 | }, 23 | "game_state": { 24 | "scores": [ 25 | { 26 | "label": "Player 1", 27 | "encoding": "bcd", 28 | "offsets": [ 29 | "0x1BE", 30 | "0x1AE", 31 | "0x1AF", 32 | "0x1B0", 33 | "0x1B1" 34 | ] 35 | }, 36 | { 37 | "label": "Player 2", 38 | "encoding": "bcd", 39 | "offsets": [ 40 | "0x1BF", 41 | "0x1B2", 42 | "0x1B3", 43 | "0x1B4", 44 | "0x1B5" 45 | ] 46 | }, 47 | { 48 | "label": "Player 3", 49 | "encoding": "bcd", 50 | "offsets": [ 51 | "0x1C0", 52 | "0x1B6", 53 | "0x1B7", 54 | "0x1B8", 55 | "0x1B9" 56 | ] 57 | }, 58 | { 59 | "label": "Player 4", 60 | "encoding": "bcd", 61 | "offsets": [ 62 | "0x1C1", 63 | "0x1BA", 64 | "0x1BB", 65 | "0x1BC", 66 | "0x1BD" 67 | ] 68 | } 69 | ], 70 | "credits": { 71 | "_notes": "Also at 0x51D?", 72 | "label": "Credits", 73 | "start": "0x16BE", 74 | "encoding": "bcd" 75 | }, 76 | "free_play": { 77 | "label": "Free Play", 78 | "start": "0x1E04", 79 | "encoding": "bool" 80 | }, 81 | "max_credits": { 82 | "label": "Max Credits", 83 | "start": "0x1E0F", 84 | "encoding": "bcd" 85 | }, 86 | "player_count": { 87 | "label": "Player Count", 88 | "start": "0x1A2", 89 | "encoding": "int" 90 | }, 91 | "ball_count": { 92 | "label": "Ball Count", 93 | "start": "0x1E0D", 94 | "encoding": "bcd" 95 | }, 96 | "current_player": { 97 | "label": "Player", 98 | "start": "0x19F", 99 | "encoding": "int" 100 | }, 101 | "current_ball": { 102 | "label": "Ball", 103 | "start": "0x1A0", 104 | "encoding": "int" 105 | }, 106 | "game_over": { 107 | "_notes": "game is over if current player/ball is 0", 108 | "label": "Game Over", 109 | "start": "0x19F", 110 | "encoding": "bool", 111 | "invert": true 112 | } 113 | }, 114 | "high_scores": [ 115 | { 116 | "label": "Admiral", 117 | "short_label": "#1", 118 | "initials": { 119 | "start": "0x16AA", 120 | "encoding": "ch", 121 | "length": 3 122 | }, 123 | "score": { 124 | "encoding": "bcd", 125 | "offsets": [ 126 | "0x1690", 127 | "0x1678", 128 | "0x1679", 129 | "0x167A", 130 | "0x167B" 131 | ] 132 | } 133 | }, 134 | { 135 | "label": "Rear Admiral", 136 | "short_label": "#2", 137 | "initials": { 138 | "start": "0x16AD", 139 | "encoding": "ch", 140 | "length": 3 141 | }, 142 | "score": { 143 | "encoding": "bcd", 144 | "offsets": [ 145 | "0x1691", 146 | "0x167C", 147 | "0x167D", 148 | "0x167E", 149 | "0x167F" 150 | ] 151 | } 152 | }, 153 | { 154 | "label": "Captain", 155 | "short_label": "#3", 156 | "initials": { 157 | "start": "0x16B0", 158 | "encoding": "ch", 159 | "length": 3 160 | }, 161 | "score": { 162 | "encoding": "bcd", 163 | "offsets": [ 164 | "0x1692", 165 | "0x1680", 166 | "0x1681", 167 | "0x1682", 168 | "0x1683" 169 | ] 170 | } 171 | }, 172 | { 173 | "label": "Commander", 174 | "short_label": "#4", 175 | "initials": { 176 | "start": "0x16B3", 177 | "encoding": "ch", 178 | "length": 3 179 | }, 180 | "score": { 181 | "encoding": "bcd", 182 | "offsets": [ 183 | "0x1693", 184 | "0x1684", 185 | "0x1685", 186 | "0x1686", 187 | "0x1687" 188 | ] 189 | } 190 | }, 191 | { 192 | "label": "Lieutenant", 193 | "short_label": "#5", 194 | "initials": { 195 | "start": "0x16B6", 196 | "encoding": "ch", 197 | "length": 3 198 | }, 199 | "score": { 200 | "encoding": "bcd", 201 | "offsets": [ 202 | "0x1694", 203 | "0x1688", 204 | "0x1689", 205 | "0x168A", 206 | "0x168B" 207 | ] 208 | } 209 | }, 210 | { 211 | "label": "Lieutenant J.G.", 212 | "short_label": "#6", 213 | "initials": { 214 | "start": "0x16B9", 215 | "encoding": "ch", 216 | "length": 3 217 | }, 218 | "score": { 219 | "encoding": "bcd", 220 | "offsets": [ 221 | "0x1695", 222 | "0x168C", 223 | "0x168D", 224 | "0x168E", 225 | "0x168F" 226 | ] 227 | } 228 | } 229 | ] 230 | } 231 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/smman.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "The Six Million Dollar Man (Bally 1978)", 5 | "https://www.ipdb.org/machine.cgi?id=2165", 6 | "https://opdb.org/machines/4721", 7 | "Bally MPU AS-2518-35 (U6: 720-30_6.716)", 8 | "Six players" 9 | ], 10 | "_fileformat": 0.8, 11 | "_metadata": { 12 | "version": 2, 13 | "copyright": [ 14 | "Copyright (C) 2024 by Francis De Brabandere ", 15 | "Copyright (C) 2025 by Tom Collins " 16 | ], 17 | "license": "GNU Lesser General Public License v3.0", 18 | "platform": "bally-35-6K", 19 | "roms": [ 20 | "smman" 21 | ] 22 | }, 23 | "game_state": { 24 | "credits": { 25 | "label": "Credits", 26 | "start": "0x02D5", 27 | "length": 2, 28 | "encoding": "bcd" 29 | }, 30 | "scores": [ 31 | { 32 | "label": "Player 1", 33 | "start": "0x021E", 34 | "encoding": "bcd", 35 | "length": 6 36 | }, 37 | { 38 | "label": "Player 2", 39 | "start": "0x0224", 40 | "encoding": "bcd", 41 | "length": 6 42 | }, 43 | { 44 | "label": "Player 3", 45 | "start": "0x022A", 46 | "encoding": "bcd", 47 | "length": 6 48 | }, 49 | { 50 | "label": "Player 4", 51 | "start": "0x0230", 52 | "encoding": "bcd", 53 | "length": 6 54 | }, 55 | { 56 | "label": "Player 5", 57 | "start": "0x0218", 58 | "encoding": "bcd", 59 | "length": 6 60 | }, 61 | { 62 | "label": "Player 6", 63 | "start": "0x0212", 64 | "encoding": "bcd", 65 | "length": 6 66 | } 67 | ], 68 | "final_scores": [ 69 | { 70 | "label": "Final Score P1", 71 | "start": "0x0249", 72 | "encoding": "bcd", 73 | "length": 6 74 | }, 75 | { 76 | "label": "Final Score P2", 77 | "start": "0x024F", 78 | "encoding": "bcd", 79 | "length": 6 80 | }, 81 | { 82 | "label": "Final Score P3", 83 | "start": "0x0255", 84 | "encoding": "bcd", 85 | "length": 6 86 | }, 87 | { 88 | "label": "Final Score P4", 89 | "start": "0x025B", 90 | "encoding": "bcd", 91 | "length": 6 92 | }, 93 | { 94 | "label": "Final Score P5", 95 | "start": "0x0243", 96 | "encoding": "bcd", 97 | "length": 6 98 | }, 99 | { 100 | "label": "Final Score P6", 101 | "start": "0x023D", 102 | "encoding": "bcd", 103 | "length": 6 104 | } 105 | ], 106 | "current_ball": { 107 | "label": "Current Ball", 108 | "start": "0x12", 109 | "encoding": "bcd" 110 | }, 111 | "player_count": { 112 | "label": "Players", 113 | "start": "0x13", 114 | "encoding": "bcd" 115 | }, 116 | "current_player": { 117 | "label": "Current Player", 118 | "start": "0x14", 119 | "encoding": "bcd" 120 | }, 121 | "ball_count": { 122 | "label": "Ball Count", 123 | "encoding": "dipsw", 124 | "offsets": [ 125 | 16 126 | ], 127 | "values": [ 128 | 3, 129 | 5 130 | ] 131 | }, 132 | "max_credits": { 133 | "label": "Max Credits", 134 | "encoding": "dipsw", 135 | "offsets": [ 136 | 19, 137 | 18, 138 | 17 139 | ], 140 | "values": [ 141 | 5, 142 | 10, 143 | 15, 144 | 20, 145 | 25, 146 | 30, 147 | 35, 148 | 40 149 | ] 150 | }, 151 | "game_over": { 152 | "_notes": "reading 'game over' lamp", 153 | "label": "Game Over", 154 | "start": "0x20C", 155 | "encoding": "bool", 156 | "mask": "0x4", 157 | "invert": true 158 | }, 159 | "tilted": { 160 | "_notes": "reading 'tilt' lamp", 161 | "label": "Tilted", 162 | "start": "0x20C", 163 | "encoding": "bool", 164 | "mask": "0x8", 165 | "invert": true 166 | } 167 | }, 168 | "high_scores": [ 169 | { 170 | "label": "High Score", 171 | "short_label": "HS", 172 | "score": { 173 | "start": "0x02CF", 174 | "encoding": "bcd", 175 | "length": 6 176 | } 177 | } 178 | ], 179 | "audits": { 180 | "Bookkeeping functions": { 181 | "05": { 182 | "label": "Current Credits", 183 | "start": "0x02D5", 184 | "length": 6, 185 | "encoding": "bcd", 186 | "min": 0, 187 | "max": 40 188 | }, 189 | "06": { 190 | "label": "Total Plays (Paid and Free Games)", 191 | "start": "0x02DB", 192 | "length": 6, 193 | "encoding": "bcd", 194 | "min": 0, 195 | "max": 999999 196 | }, 197 | "07": { 198 | "label": "Total Replays (Free Games)", 199 | "start": "0x02E1", 200 | "length": 6, 201 | "encoding": "bcd", 202 | "min": 0, 203 | "max": 999999 204 | }, 205 | "08": { 206 | "label": "HSTD Achieved", 207 | "start": "0x02E7", 208 | "length": 6, 209 | "encoding": "bcd", 210 | "min": 0, 211 | "max": 999999 212 | }, 213 | "09": { 214 | "label": "Coin Chute #1", 215 | "start": "0x02ED", 216 | "length": 6, 217 | "encoding": "bcd", 218 | "min": 0, 219 | "max": 999999 220 | }, 221 | "10": { 222 | "label": "Coin Chute #2", 223 | "start": "0x02F3", 224 | "length": 6, 225 | "encoding": "bcd", 226 | "min": 0, 227 | "max": 999999 228 | }, 229 | "11": { 230 | "label": "Coin Chute #3", 231 | "start": "0x02F9", 232 | "length": 6, 233 | "encoding": "bcd", 234 | "min": 0, 235 | "max": 999999 236 | } 237 | } 238 | } 239 | } 240 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/smmanc.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "The Six Million Dollar Man (Bally 1978)", 5 | "https://www.ipdb.org/machine.cgi?id=2165", 6 | "https://opdb.org/machines/4721", 7 | "Bally MPU AS-2518-35 (U6: 720-30_6.716)", 8 | "Six players" 9 | ], 10 | "_fileformat": 0.8, 11 | "_metadata": { 12 | "version": 2, 13 | "copyright": [ 14 | "Copyright (C) 2024 by Francis De Brabandere ", 15 | "Copyright (C) 2025 by Tom Collins " 16 | ], 17 | "license": "GNU Lesser General Public License v3.0", 18 | "platform": "bally-35-8K", 19 | "roms": [ 20 | "smmanc" 21 | ] 22 | }, 23 | "game_state": { 24 | "credits": { 25 | "label": "Credits", 26 | "start": "0x02D5", 27 | "length": 2, 28 | "encoding": "bcd" 29 | }, 30 | "scores": [ 31 | { 32 | "label": "Player 1", 33 | "start": "0x021E", 34 | "encoding": "bcd", 35 | "length": 6 36 | }, 37 | { 38 | "label": "Player 2", 39 | "start": "0x0224", 40 | "encoding": "bcd", 41 | "length": 6 42 | }, 43 | { 44 | "label": "Player 3", 45 | "start": "0x022A", 46 | "encoding": "bcd", 47 | "length": 6 48 | }, 49 | { 50 | "label": "Player 4", 51 | "start": "0x0230", 52 | "encoding": "bcd", 53 | "length": 6 54 | }, 55 | { 56 | "label": "Player 5", 57 | "start": "0x0218", 58 | "encoding": "bcd", 59 | "length": 6 60 | }, 61 | { 62 | "label": "Player 6", 63 | "start": "0x0212", 64 | "encoding": "bcd", 65 | "length": 6 66 | } 67 | ], 68 | "final_scores": [ 69 | { 70 | "label": "Final Score P1", 71 | "start": "0x0249", 72 | "encoding": "bcd", 73 | "length": 6 74 | }, 75 | { 76 | "label": "Final Score P2", 77 | "start": "0x024F", 78 | "encoding": "bcd", 79 | "length": 6 80 | }, 81 | { 82 | "label": "Final Score P3", 83 | "start": "0x0255", 84 | "encoding": "bcd", 85 | "length": 6 86 | }, 87 | { 88 | "label": "Final Score P4", 89 | "start": "0x025B", 90 | "encoding": "bcd", 91 | "length": 6 92 | }, 93 | { 94 | "label": "Final Score P5", 95 | "start": "0x0243", 96 | "encoding": "bcd", 97 | "length": 6 98 | }, 99 | { 100 | "label": "Final Score P6", 101 | "start": "0x023D", 102 | "encoding": "bcd", 103 | "length": 6 104 | } 105 | ], 106 | "current_ball": { 107 | "label": "Current Ball", 108 | "start": "0x12", 109 | "encoding": "bcd" 110 | }, 111 | "player_count": { 112 | "label": "Players", 113 | "start": "0x13", 114 | "encoding": "bcd" 115 | }, 116 | "current_player": { 117 | "label": "Current Player", 118 | "start": "0x14", 119 | "encoding": "bcd" 120 | }, 121 | "ball_count": { 122 | "label": "Ball Count", 123 | "encoding": "dipsw", 124 | "offsets": [ 125 | 16 126 | ], 127 | "values": [ 128 | 3, 129 | 5 130 | ] 131 | }, 132 | "max_credits": { 133 | "label": "Max Credits", 134 | "encoding": "dipsw", 135 | "offsets": [ 136 | 19, 137 | 18, 138 | 17 139 | ], 140 | "values": [ 141 | 5, 142 | 10, 143 | 15, 144 | 20, 145 | 25, 146 | 30, 147 | 35, 148 | 40 149 | ] 150 | }, 151 | "game_over": { 152 | "_notes": "reading 'game over' lamp", 153 | "label": "Game Over", 154 | "start": "0x20C", 155 | "encoding": "bool", 156 | "mask": "0x4", 157 | "invert": true 158 | }, 159 | "tilted": { 160 | "_notes": "reading 'tilt' lamp", 161 | "label": "Tilted", 162 | "start": "0x20C", 163 | "encoding": "bool", 164 | "mask": "0x8", 165 | "invert": true 166 | } 167 | }, 168 | "high_scores": [ 169 | { 170 | "label": "High Score", 171 | "short_label": "HS", 172 | "score": { 173 | "start": "0x02CF", 174 | "encoding": "bcd", 175 | "length": 6 176 | } 177 | } 178 | ], 179 | "audits": { 180 | "Bookkeeping functions": { 181 | "05": { 182 | "label": "Current Credits", 183 | "start": "0x02D5", 184 | "length": 6, 185 | "encoding": "bcd", 186 | "min": 0, 187 | "max": 40 188 | }, 189 | "06": { 190 | "label": "Total Plays (Paid and Free Games)", 191 | "start": "0x02DB", 192 | "length": 6, 193 | "encoding": "bcd", 194 | "min": 0, 195 | "max": 999999 196 | }, 197 | "07": { 198 | "label": "Total Replays (Free Games)", 199 | "start": "0x02E1", 200 | "length": 6, 201 | "encoding": "bcd", 202 | "min": 0, 203 | "max": 999999 204 | }, 205 | "08": { 206 | "label": "HSTD Achieved", 207 | "start": "0x02E7", 208 | "length": 6, 209 | "encoding": "bcd", 210 | "min": 0, 211 | "max": 999999 212 | }, 213 | "09": { 214 | "label": "Coin Chute #1", 215 | "start": "0x02ED", 216 | "length": 6, 217 | "encoding": "bcd", 218 | "min": 0, 219 | "max": 999999 220 | }, 221 | "10": { 222 | "label": "Coin Chute #2", 223 | "start": "0x02F3", 224 | "length": 6, 225 | "encoding": "bcd", 226 | "min": 0, 227 | "max": 999999 228 | }, 229 | "11": { 230 | "label": "Coin Chute #3", 231 | "start": "0x02F9", 232 | "length": 6, 233 | "encoding": "bcd", 234 | "min": 0, 235 | "max": 999999 236 | } 237 | } 238 | } 239 | } 240 | -------------------------------------------------------------------------------- /maps/stern/whitestar/strikext.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Tom Collins", 4 | "Checksum for settings at 0x1FBD/0x1FBE? Increases when settings increase." 5 | ], 6 | "_fileformat": 0.8, 7 | "_metadata": { 8 | "version": 1, 9 | "copyright": [ 10 | "Copyright (C) 2025 by Tom Collins " 11 | ], 12 | "license": "GNU Lesser General Public License v3.0", 13 | "platform": "whitestar", 14 | "roms": [ 15 | "nfl", 16 | "strikext" 17 | ] 18 | }, 19 | "game_state": { 20 | "scores": [ 21 | { 22 | "label": "Player 1", 23 | "start": "0x154C", 24 | "length": 5, 25 | "encoding": "bcd" 26 | }, 27 | { 28 | "label": "Player 2", 29 | "start": "0x1551", 30 | "length": 5, 31 | "encoding": "bcd" 32 | }, 33 | { 34 | "label": "Player 3", 35 | "start": "0x1556", 36 | "length": 5, 37 | "encoding": "bcd" 38 | }, 39 | { 40 | "label": "Player 4", 41 | "start": "0x155B", 42 | "length": 5, 43 | "encoding": "bcd" 44 | }, 45 | { 46 | "label": "Player 5", 47 | "start": "0x1560", 48 | "length": 5, 49 | "encoding": "bcd" 50 | }, 51 | { 52 | "label": "Player 6", 53 | "start": "0x1565", 54 | "length": 5, 55 | "encoding": "bcd" 56 | } 57 | ], 58 | "credits": { 59 | "label": "Credits", 60 | "start": "0x1546", 61 | "encoding": "bcd" 62 | }, 63 | "max_credits": { 64 | "label": "Max Credits", 65 | "start": "0x1E13", 66 | "encoding": "bcd" 67 | }, 68 | "free_play": { 69 | "label": "Free Play", 70 | "start": "0x1E04", 71 | "encoding": "bool" 72 | }, 73 | "tilted": { 74 | "_notes": "maybe 0x15C or 0x180; 0x164 might be tilt warnings", 75 | "label": "Tilted", 76 | "start": "0x1F1", 77 | "encoding": "bool" 78 | }, 79 | "current_player": { 80 | "label": "Current Player", 81 | "start": "0x1F3", 82 | "encoding": "bcd" 83 | }, 84 | "current_ball": { 85 | "label": "Current Ball", 86 | "start": "0x1F4", 87 | "encoding": "bcd" 88 | }, 89 | "player_count": { 90 | "label": "Player Count", 91 | "start": "0x1F6", 92 | "encoding": "bcd" 93 | }, 94 | "ball_count": { 95 | "label": "Ball Count", 96 | "start": "0x1E11", 97 | "encoding": "bcd" 98 | }, 99 | "game_over": { 100 | "_notes": "current_player == 0", 101 | "label": "Game Over", 102 | "start": "0x1F3", 103 | "encoding": "bool", 104 | "invert": true 105 | } 106 | }, 107 | "high_scores": [ 108 | { 109 | "label": "#1", 110 | "initials": { 111 | "start": 5346, 112 | "encoding": "ch", 113 | "length": 10 114 | }, 115 | "score": { 116 | "encoding": "bcd", 117 | "length": 5, 118 | "start": 5264 119 | } 120 | }, 121 | { 122 | "label": "#2", 123 | "initials": { 124 | "start": 5356, 125 | "encoding": "ch", 126 | "length": 10 127 | }, 128 | "score": { 129 | "encoding": "bcd", 130 | "length": 5, 131 | "start": 5269 132 | } 133 | }, 134 | { 135 | "label": "#3", 136 | "initials": { 137 | "start": 5366, 138 | "encoding": "ch", 139 | "length": 10 140 | }, 141 | "score": { 142 | "encoding": "bcd", 143 | "length": 5, 144 | "start": 5274 145 | } 146 | }, 147 | { 148 | "label": "#4", 149 | "initials": { 150 | "start": 5376, 151 | "encoding": "ch", 152 | "length": 10 153 | }, 154 | "score": { 155 | "encoding": "bcd", 156 | "length": 5, 157 | "start": 5279 158 | } 159 | }, 160 | { 161 | "label": "#5", 162 | "initials": { 163 | "start": 5386, 164 | "encoding": "ch", 165 | "length": 10 166 | }, 167 | "score": { 168 | "encoding": "bcd", 169 | "length": 5, 170 | "start": 5284 171 | } 172 | }, 173 | { 174 | "label": "#6", 175 | "initials": { 176 | "start": 5396, 177 | "encoding": "ch", 178 | "length": 10 179 | }, 180 | "score": { 181 | "encoding": "bcd", 182 | "length": 5, 183 | "start": 5289 184 | } 185 | }, 186 | { 187 | "label": "#7", 188 | "initials": { 189 | "start": 5406, 190 | "encoding": "ch", 191 | "length": 10 192 | }, 193 | "score": { 194 | "encoding": "bcd", 195 | "length": 5, 196 | "start": 5294 197 | } 198 | }, 199 | { 200 | "label": "#8", 201 | "initials": { 202 | "start": 5416, 203 | "encoding": "ch", 204 | "length": 10 205 | }, 206 | "score": { 207 | "encoding": "bcd", 208 | "length": 5, 209 | "start": 5299 210 | } 211 | }, 212 | { 213 | "label": "#9", 214 | "initials": { 215 | "start": 5426, 216 | "encoding": "ch", 217 | "length": 10 218 | }, 219 | "score": { 220 | "encoding": "bcd", 221 | "length": 5, 222 | "start": 5304 223 | } 224 | }, 225 | { 226 | "label": "#10", 227 | "initials": { 228 | "start": 5436, 229 | "encoding": "ch", 230 | "length": 10 231 | }, 232 | "score": { 233 | "encoding": "bcd", 234 | "length": 5, 235 | "start": 5309 236 | } 237 | } 238 | ], 239 | "mode_champions": [ 240 | { 241 | "label": "Goal Champ", 242 | "initials": { 243 | "start": "0x1599", 244 | "length": 3, 245 | "encoding": "ch" 246 | }, 247 | "score": { 248 | "start": "0x159C", 249 | "encoding": "bcd", 250 | "suffix": " goals" 251 | } 252 | } 253 | ] 254 | } 255 | -------------------------------------------------------------------------------- /tools/normalize-map.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Script to normalize the nvram map files: 5 | - One entry per line. 6 | - Indent with 2 spaces. 7 | - Convert name of `_note` attribute to `_notes`. 8 | 9 | Usage: 10 | normalize-map.py mapname.map.json 11 | normalize-map.py *.map.json 12 | 13 | File format updates 14 | ------------------- 15 | * v0.8: 16 | - checksum8/checksum16 objects can have a checksum property 17 | - new 'bool' encoding 18 | 19 | * v0.7: 20 | - add `platform` metadata 21 | - start/end/offsets hex values no longer deprecated (and are now preferred) 22 | 23 | * v0.6: 24 | - move metadata properties into a separate `_metadata` section 25 | 26 | * v0.5: 27 | - introduce `dipsw` encoding and `_values` metadata property 28 | 29 | * v0.4: 30 | - introduce new `_nibble` property 31 | 32 | * v0.3: 33 | - convert start/end values stored as hex strings to decimal values 34 | - introduce new `null` attribute for `ch` encoding 35 | 36 | * v0.2: 37 | - remove "packed"=true and replace "packed"=false with "nibble"="low" 38 | """ 39 | 40 | import json 41 | import sys 42 | from collections import OrderedDict 43 | 44 | # global to hold required file format for last converted file 45 | file_format = 0.0 46 | 47 | 48 | def minimum_file_format(v): 49 | global file_format 50 | 51 | if file_format < v: 52 | file_format = v 53 | 54 | 55 | def map_convert(pairs): 56 | global file_format 57 | 58 | result = OrderedDict() 59 | for k, v in pairs: 60 | if k == '_note': 61 | k = '_notes' 62 | 63 | # set minimum file format based on appearance of certain keys 64 | if k == '_fileformat': 65 | minimum_file_format(v) 66 | elif k == 'checksum': 67 | # checksum attribute for checksum8/checksum16 objects added in v0.8 68 | minimum_file_format(0.8) 69 | elif k == 'encoding' and v == 'bool': 70 | minimum_file_format(0.8) 71 | elif k == 'platform': 72 | # metadata "platform" introduced in v0.7 73 | minimum_file_format(0.7) 74 | elif k == '_nibble': 75 | # global "_nibble" introduced in v0.4 76 | minimum_file_format(0.4) 77 | elif k == 'nibble': 78 | # "nibble" is only valid in v0.2 and later 79 | minimum_file_format(0.2) 80 | elif k == 'null': 81 | # "null" is only valid in v0.3 and later 82 | minimum_file_format(0.3) 83 | elif k == '_values' or (k == 'encoding' and v == 'dipsw'): 84 | # "_values" appeared in v0.5 along with "dipsw" encoding 85 | minimum_file_format(0.5) 86 | 87 | if k == 'version' and type(v) is float: 88 | v = int(v * 10) 89 | 90 | if k == 'packed': 91 | # as of v0.2, "packed" attribute deprecated in favor of "nibble" 92 | if not v: 93 | # replace packed=false with nibble=low 94 | result['nibble'] = 'low' 95 | minimum_file_format(0.2) 96 | # silently remove default packed=true 97 | else: 98 | result[k] = v 99 | 100 | return result 101 | 102 | 103 | def create_metadata(map_data: OrderedDict): 104 | """ 105 | Move all underscore-prefixed properties (other than `_notes` and `_fileformat`) to 106 | a new `_metadata` property. 107 | 108 | :param map_data: map to convert (converted in-place) 109 | :return: 110 | """ 111 | if '_metadata' not in map_data: 112 | map_data['_metadata'] = OrderedDict() 113 | 114 | delete_keys = [] 115 | for key, entry in map_data.items(): 116 | if key.startswith('_'): 117 | if key not in ['_notes', '_fileformat', '_metadata']: 118 | # remove leading underscore from key when adding to _metadata 119 | delete_keys.append(key) 120 | map_data['_metadata'][key[1:]] = entry 121 | else: 122 | map_data[key] = entry 123 | 124 | # delete keys moved to _metadata 125 | for key in delete_keys: 126 | del map_data[key] 127 | 128 | for entry in ['_metadata', '_fileformat', '_notes']: 129 | if entry in map_data: 130 | map_data.move_to_end(entry, last=False) 131 | 132 | # keep version as first property of _metadata 133 | map_data['_metadata'].move_to_end('version', last=False) 134 | 135 | 136 | def rename_last_game(map_data: OrderedDict): 137 | # move last_game into game_state 138 | if 'last_game' in map_data: 139 | if 'game_state' not in map_data: 140 | map_data['game_state'] = OrderedDict() 141 | map_data['game_state']['scores'] = map_data['last_game'] 142 | for index, entry in enumerate(map_data['game_state']['scores']): 143 | if 'label' not in entry: 144 | # make sure entry has a label 145 | entry['label'] = 'Player %u' % (index + 1) 146 | entry.move_to_end('label', last=False) 147 | del map_data['last_game'] 148 | 149 | # make sure game_state is at the top of the file 150 | for entry in ['game_state', '_metadata', '_fileformat', '_notes']: 151 | if entry in map_data: 152 | map_data.move_to_end(entry, last=False) 153 | 154 | 155 | exitcode = 0 156 | for filename in sys.argv[1:]: 157 | file_format = 0.6 # default to 0.6, first _fileformat with _metadata property 158 | try: 159 | data = json.load(open(filename, 'r'), object_pairs_hook=map_convert) 160 | data['_fileformat'] = file_format 161 | create_metadata(data) 162 | rename_last_game(data) 163 | with open(filename, 'w') as outfile: 164 | outfile.write(json.dumps(data, indent=2)) 165 | # add trailing newline to match `jq` output 166 | outfile.write('\n') 167 | except json.decoder.JSONDecodeError as e: 168 | print("JSON decode error(s) for %s:\n%s\n" % (filename, str(e))) 169 | # at least one JSON file was improperly formatted 170 | exitcode = 1 171 | 172 | raise SystemExit(exitcode) 173 | -------------------------------------------------------------------------------- /maps/stern/stern-m100.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "2023-10 Initial version by Tom Collins. Required new `nibble` attribute.", 4 | "NVRAM file mapped to memory address 0x200 in PinMAME", 5 | "Valid for all Stern M-100 MPU games. See stern-m100-freeplay for 'fp' ROMs.", 6 | "Untested with blkshpsq (Astro game), draculc/wildfyrc (mod), stars/starsb7 (mod), stingrab (mod).", 7 | "Won't work with larger, modified ROMs: magicb, princesb." 8 | ], 9 | "_fileformat": 0.8, 10 | "_metadata": { 11 | "version": 3, 12 | "copyright": [ 13 | "Copyright (C) 2023 by Tom Collins ", 14 | "Copyright (C) 2025 by Tom Collins " 15 | ], 16 | "license": "GNU Lesser General Public License v3.0", 17 | "platform": "stern-m100", 18 | "roms": [ 19 | "dracula", 20 | "hothand", 21 | "lectrono", 22 | "magic", 23 | "memlane", 24 | "nugent", 25 | "pinball", 26 | "princess", 27 | "stars", 28 | "stingray", 29 | "trident", 30 | "tridenta", 31 | "wildfyre" 32 | ] 33 | }, 34 | "game_state": { 35 | "match": { 36 | "label": "Match", 37 | "start": "0x0236", 38 | "length": 2, 39 | "encoding": "bcd", 40 | "_notes": "during a game, shows current ball (1-5)", 41 | "special_values": { 42 | "1": "n/a", 43 | "2": "n/a", 44 | "3": "n/a", 45 | "4": "n/a", 46 | "5": "n/a" 47 | } 48 | }, 49 | "credits": { 50 | "label": "Credits", 51 | "start": "0x02D5", 52 | "length": 2, 53 | "encoding": "bcd" 54 | }, 55 | "scores": [ 56 | { 57 | "label": "Player 1", 58 | "start": "0x021E", 59 | "encoding": "bcd", 60 | "length": 6 61 | }, 62 | { 63 | "label": "Player 2", 64 | "start": "0x0224", 65 | "encoding": "bcd", 66 | "length": 6 67 | }, 68 | { 69 | "label": "Player 3", 70 | "start": "0x022A", 71 | "encoding": "bcd", 72 | "length": 6 73 | }, 74 | { 75 | "label": "Player 4", 76 | "start": "0x0230", 77 | "encoding": "bcd", 78 | "length": 6 79 | } 80 | ], 81 | "final_scores": [ 82 | { 83 | "label": "Final P1", 84 | "start": "0x023C", 85 | "encoding": "bcd", 86 | "length": 6 87 | }, 88 | { 89 | "label": "Final P2", 90 | "start": "0x0242", 91 | "encoding": "bcd", 92 | "length": 6 93 | }, 94 | { 95 | "label": "Final P3", 96 | "start": "0x0248", 97 | "encoding": "bcd", 98 | "length": 6 99 | }, 100 | { 101 | "label": "Final P4", 102 | "start": "0x024E", 103 | "encoding": "bcd", 104 | "length": 6 105 | } 106 | ], 107 | "current_ball": { 108 | "label": "Current Ball", 109 | "start": "0x13", 110 | "encoding": "bcd" 111 | }, 112 | "player_count": { 113 | "label": "Players", 114 | "start": "0x14", 115 | "encoding": "bcd" 116 | }, 117 | "current_player": { 118 | "label": "Current Player", 119 | "start": "0x15", 120 | "encoding": "bcd" 121 | }, 122 | "ball_count": { 123 | "label": "Ball Count", 124 | "encoding": "dipsw", 125 | "offsets": [ 126 | 7 127 | ], 128 | "values": [ 129 | 3, 130 | 5 131 | ] 132 | }, 133 | "max_credits": { 134 | "label": "Max Credits", 135 | "encoding": "dipsw", 136 | "offsets": [ 137 | 19, 138 | 18, 139 | 17 140 | ], 141 | "values": [ 142 | 5, 143 | 10, 144 | 15, 145 | 20, 146 | 25, 147 | 30, 148 | 35, 149 | 40 150 | ] 151 | }, 152 | "game_over": { 153 | "_notes": "reading 'game over' lamp", 154 | "label": "Game Over", 155 | "start": "0x20C", 156 | "encoding": "bool", 157 | "mask": "0x4", 158 | "invert": true 159 | }, 160 | "tilted": { 161 | "_notes": "reading 'tilt' lamp", 162 | "label": "Tilted", 163 | "start": "0x20C", 164 | "encoding": "bool", 165 | "mask": "0x8", 166 | "invert": true 167 | } 168 | }, 169 | "high_scores": [ 170 | { 171 | "label": "High Score", 172 | "short_label": "HS", 173 | "score": { 174 | "start": "0x02CF", 175 | "length": 6, 176 | "encoding": "bcd" 177 | } 178 | } 179 | ], 180 | "adjustments": { 181 | "Adjustments": { 182 | "01": { 183 | "label": "Replay 1", 184 | "start": "0x02BD", 185 | "length": 6, 186 | "encoding": "bcd" 187 | }, 188 | "02": { 189 | "label": "Replay 2", 190 | "start": "0x02C3", 191 | "length": 6, 192 | "encoding": "bcd" 193 | }, 194 | "03": { 195 | "label": "Replay 3", 196 | "start": "0x02C9", 197 | "length": 6, 198 | "encoding": "bcd" 199 | }, 200 | "04": { 201 | "label": "High Score", 202 | "start": "0x02CF", 203 | "length": 6, 204 | "encoding": "bcd" 205 | } 206 | } 207 | }, 208 | "audits": { 209 | "Audits": { 210 | "05": { 211 | "label": "Credits", 212 | "start": "0x02D5", 213 | "length": 2, 214 | "encoding": "bcd" 215 | }, 216 | "06": { 217 | "label": "Total Plays", 218 | "start": "0x02DB", 219 | "length": 6, 220 | "encoding": "bcd" 221 | }, 222 | "07": { 223 | "label": "Total Replays", 224 | "start": "0x02E1", 225 | "length": 6, 226 | "encoding": "bcd" 227 | }, 228 | "08": { 229 | "label": "HSTD Beaten", 230 | "start": "0x02E7", 231 | "length": 6, 232 | "encoding": "bcd" 233 | }, 234 | "09": { 235 | "label": "Coin Chute 2", 236 | "start": "0x02ED", 237 | "length": 6, 238 | "encoding": "bcd" 239 | }, 240 | "10": { 241 | "label": "Coin Chute 1", 242 | "start": "0x02F3", 243 | "length": 6, 244 | "encoding": "bcd" 245 | }, 246 | "11": { 247 | "label": "Coin Chute 3", 248 | "start": "0x02F9", 249 | "length": 6, 250 | "encoding": "bcd" 251 | } 252 | } 253 | } 254 | } 255 | -------------------------------------------------------------------------------- /maps/bally/as-2518-35/skatebll.map.json: -------------------------------------------------------------------------------- 1 | { 2 | "_notes": [ 3 | "Compiled by Francis De Brabandere.", 4 | "Skateball (Bally 1980)", 5 | "https://www.ipdb.org/machine.cgi?id=2170", 6 | "https://opdb.org/machines/1817", 7 | "Bally MPU AS-2518-35 (U6: 720-40_6.732)", 8 | "7-digit score display", 9 | "By default the credits are not shown, set dip switch 27 to show them." 10 | ], 11 | "_fileformat": 0.8, 12 | "_metadata": { 13 | "version": 2, 14 | "copyright": [ 15 | "Copyright (C) 2024 by Francis De Brabandere ", 16 | "Copyright (C) 2025 by Tom Collins " 17 | ], 18 | "license": "GNU Lesser General Public License v3.0", 19 | "platform": "bally-35-8K", 20 | "roms": [ 21 | "skatebll" 22 | ] 23 | }, 24 | "game_state": { 25 | "_notes": [ 26 | "score @ 0x21E, 0x225, 0x22C, 0x233 are display memory, and active in game", 27 | "during attract, last game scores at 0x248, 0x24F, 0x256, 0x25D" 28 | ], 29 | "credits": { 30 | "label": "Credits", 31 | "start": "0x02AD", 32 | "length": 2, 33 | "encoding": "bcd" 34 | }, 35 | "scores": [ 36 | { 37 | "label": "Player 1", 38 | "start": "0x021E", 39 | "encoding": "bcd", 40 | "length": 7 41 | }, 42 | { 43 | "label": "Player 2", 44 | "start": "0x0225", 45 | "encoding": "bcd", 46 | "length": 7 47 | }, 48 | { 49 | "label": "Player 3", 50 | "start": "0x022C", 51 | "encoding": "bcd", 52 | "length": 7 53 | }, 54 | { 55 | "label": "Player 4", 56 | "start": "0x0233", 57 | "encoding": "bcd", 58 | "length": 7 59 | } 60 | ], 61 | "final_scores": [ 62 | { 63 | "label": "Final Score P1", 64 | "start": "0x0248", 65 | "encoding": "bcd", 66 | "length": 7 67 | }, 68 | { 69 | "label": "Final Score P2", 70 | "start": "0x024F", 71 | "encoding": "bcd", 72 | "length": 7 73 | }, 74 | { 75 | "label": "Final Score P3", 76 | "start": "0x0256", 77 | "encoding": "bcd", 78 | "length": 7 79 | }, 80 | { 81 | "label": "Final Score P4", 82 | "start": "0x025D", 83 | "encoding": "bcd", 84 | "length": 7 85 | } 86 | ], 87 | "current_ball": { 88 | "label": "Current Ball", 89 | "start": "0x0B", 90 | "encoding": "bcd" 91 | }, 92 | "player_count": { 93 | "label": "Players", 94 | "start": "0x0C", 95 | "encoding": "bcd" 96 | }, 97 | "current_player": { 98 | "label": "Current Player", 99 | "start": "0x0D", 100 | "encoding": "bcd" 101 | }, 102 | "ball_count": { 103 | "label": "Ball Count", 104 | "encoding": "dipsw", 105 | "offsets": [ 106 | 32, 107 | 31 108 | ], 109 | "values": [ 110 | 3, 111 | 5, 112 | 4, 113 | 2 114 | ] 115 | }, 116 | "max_credits": { 117 | "label": "Max Credits", 118 | "encoding": "dipsw", 119 | "offsets": [ 120 | 26, 121 | 25 122 | ], 123 | "values": [ 124 | 10, 125 | 15, 126 | 25, 127 | 40 128 | ] 129 | }, 130 | "game_over": { 131 | "_notes": "reading 'game over' lamp", 132 | "label": "Game Over", 133 | "start": "0x20C", 134 | "encoding": "bool", 135 | "mask": "0x4", 136 | "invert": true 137 | }, 138 | "tilted": { 139 | "_notes": "reading 'tilt' lamp", 140 | "label": "Tilted", 141 | "start": "0x20C", 142 | "encoding": "bool", 143 | "mask": "0x8", 144 | "invert": true 145 | } 146 | }, 147 | "high_scores": [ 148 | { 149 | "label": "High Score", 150 | "short_label": "HS", 151 | "score": { 152 | "start": "0x02A6", 153 | "encoding": "bcd", 154 | "length": 7 155 | } 156 | } 157 | ], 158 | "audits": { 159 | "Bookkeeping functions": { 160 | "05": { 161 | "label": "Current Credits", 162 | "start": "0x02AD", 163 | "length": 7, 164 | "encoding": "bcd", 165 | "min": 0, 166 | "max": 40 167 | }, 168 | "06": { 169 | "label": "Total Plays (Paid and Free Games)", 170 | "start": "0x02B4", 171 | "length": 7, 172 | "encoding": "bcd", 173 | "min": 0, 174 | "max": 99999 175 | }, 176 | "07": { 177 | "label": "Total Replays (Free Games)", 178 | "start": "0x02BB", 179 | "length": 7, 180 | "encoding": "bcd", 181 | "min": 0, 182 | "max": 99999 183 | }, 184 | "08": { 185 | "label": "Game Percentage", 186 | "start": "0x02C2", 187 | "length": 7, 188 | "encoding": "bcd", 189 | "min": 0, 190 | "max": 99999 191 | }, 192 | "09": { 193 | "label": "HSTD Achieved", 194 | "start": "0x02C9", 195 | "length": 7, 196 | "encoding": "bcd", 197 | "min": 0, 198 | "max": 99999 199 | }, 200 | "10": { 201 | "label": "Coin Chute #1", 202 | "start": "0x02D0", 203 | "length": 7, 204 | "encoding": "bcd", 205 | "min": 0, 206 | "max": 99999 207 | }, 208 | "11": { 209 | "label": "Coin Chute #2", 210 | "start": "0x02D7", 211 | "length": 7, 212 | "encoding": "bcd", 213 | "min": 0, 214 | "max": 99999 215 | }, 216 | "12": { 217 | "label": "Coin Chute #3", 218 | "start": "0x02DE", 219 | "length": 7, 220 | "encoding": "bcd", 221 | "min": 0, 222 | "max": 99999 223 | }, 224 | "13": { 225 | "label": "Specials Awarded", 226 | "start": "0x02E5", 227 | "length": 7, 228 | "encoding": "bcd", 229 | "min": 0, 230 | "max": 99999 231 | }, 232 | "14": { 233 | "label": "Minutes of Game Play", 234 | "start": "0x02EC", 235 | "length": 7, 236 | "encoding": "bcd", 237 | "min": 0, 238 | "max": 99999 239 | }, 240 | "15": { 241 | "label": "Service Credits", 242 | "start": "0x02F3", 243 | "length": 7, 244 | "encoding": "bcd", 245 | "min": 0, 246 | "max": 99999 247 | } 248 | } 249 | } 250 | } 251 | --------------------------------------------------------------------------------