diff --git a/emulators/ares.yml b/emulators/ares.yml index 0b4b50a8..170c3351 100644 --- a/emulators/ares.yml +++ b/emulators/ares.yml @@ -379,11 +379,12 @@ files: # --- PlayStation --- - name: scph5501.bin system: sony-playstation - region: [north-america] + region: [north-america, latin-america] required: true sha256: "11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef" validation: [sha256] description: "PlayStation BIOS (US)" + note: "Picked for NTSC-U, set by both America licence strings and for an executable. A disc with no recognised licence offers NTSC-U and PAL, and the Boot/Prefer setting picks (mia/medium/playstation.cpp:66-73, 92, desktop-ui/emulator/playstation.cpp:85-92, desktop-ui/emulator/emulator.cpp:40-58)." source_ref: "desktop-ui/emulator/playstation.cpp:18, desktop-ui/emulator/playstation.cpp:85-92, mia/medium/playstation.cpp:65-73" - name: scph5500.bin diff --git a/emulators/beetle_psx.yml b/emulators/beetle_psx.yml index fb584a55..fb466937 100644 --- a/emulators/beetle_psx.yml +++ b/emulators/beetle_psx.yml @@ -58,7 +58,7 @@ files: - name: "scph5501.bin" description: "SCPH-5501, 5503, 7003 (v3.0 11-18-96 A)" - region: [north-america] + region: [north-america, latin-america] required: true hle_fallback: true size: 524288 @@ -66,6 +66,7 @@ files: md5: "490f666e1afb15b7362b406ed1cea246" validation: [sha1] mode: both + note: "Picked for REGION_NA: a SYSTEM.CNF serial whose third letter is U (SCUS, SLUS), a licence string naming America, and content whose region cannot be read while the region option stays on auto (libretro.c:2172-2174, 2198, 2249-2254, 3171-3185, 4436)." source_ref: "libretro.c:613-631" aliases: - "SCPH5501.bin" diff --git a/emulators/duckstation.yml b/emulators/duckstation.yml index 05f2a18e..c3004cef 100644 --- a/emulators/duckstation.yml +++ b/emulators/duckstation.yml @@ -26,6 +26,14 @@ notes: | ref: src/core/bios.cpp:34-139 (s_image_info_by_hash) Each image has: region, region_check, fast_boot_patch type, priority score. + The console region picks the image, Auto by default. NTSC-U answers the + "Sony Computer Entertainment Amer ica" licence string, a SCUS or SLUS + executable, and every disc whose region the detector cannot read + (DiscRegion::Other, NonPS1), so a disc of any other market boots an NTSC-U image. + ref: src/core/system.cpp:650-662, 926-995, 1723-1724, 1755 + ref: src/core/bios.cpp:397-436 (FindBIOSImageInDirectory keeps a region match) + ref: src/core/settings.h:595 (DEFAULT_CONSOLE_REGION = Auto) + ImageInfo gained a version and an expected_filename field after the previous profiling pass. Neither takes part in identification: expected_filename is read only by the two settings screens, which fall back to the real filename when it @@ -58,7 +66,7 @@ files: - name: "scph1001.bin" description: "SCPH-1001, 5003, DTL-H1201, H3001 (v2.2 12-04-95 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "924e392ed05558ffdb115408c263dccf" region_check: false @@ -118,7 +126,7 @@ files: - name: "scph1001_v20.bin" description: "SCPH-1001, DTL-H1001 (v2.0 05-07-95 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "dc2b9bf8da62ec93e868cfd29f0d067d" region_check: false @@ -138,7 +146,7 @@ files: - name: "scph1001_v21.bin" description: "SCPH-1001, DTL-H1101 (v2.1 07-17-95 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "da27e8b6dab242d8f91a9b25d80c63b8" region_check: false @@ -168,7 +176,7 @@ files: - name: "scph5501.bin" description: "SCPH-5501, 5503, 7003 (v3.0 11-18-96 A)" - region: [north-america] + region: [north-america, latin-america] required: true md5: "490f666e1afb15b7362b406ed1cea246" region_check: false @@ -208,7 +216,7 @@ files: - name: "scph7001.bin" description: "SCPH-7001, 7501, 7503, 9001, 9003, 9903 (v4.1 12-16-97 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "1e68c231d0896b7eadcad1d7d8e76129" region_check: false @@ -238,7 +246,7 @@ files: - name: "scph101_v44.bin" description: "SCPH-101 (v4.4 03-24-00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "9a09ab7e49b422c007e6d54d7c49b965" region_check: false @@ -248,7 +256,7 @@ files: - name: "scph101_v45.bin" description: "SCPH-101 (v4.5 05-25-00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "6e3735ff4c7dc899ee98981385f6f3d0" region_check: false @@ -362,7 +370,7 @@ files: - name: "ps2_dtlh30001.bin" description: "PS2, DTL-H30001 (v5.0 07/27/00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "63e6fd9b3c72e0d7b920e80cf76645cd" region_check: true @@ -372,7 +380,7 @@ files: - name: "ps2_scph30001_0727.bin" description: "PS2, SCPH-30001 (v5.0 07/27/00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "a20c97c02210f16678ca3010127caf36" region_check: true @@ -382,7 +390,7 @@ files: - name: "ps2_scph30001_0902.bin" description: "PS2, SCPH-30001 (v5.0 09/02/00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "8db2fbbac7413bf3e7154c1e0715e565" region_check: true @@ -442,7 +450,7 @@ files: - name: "ps2_dtlh30101.bin" description: "PS2, DTL-H30101 (v5.0 12/28/00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "0bf988e9c7aaa4c051805b0fa6eb3387" region_check: true @@ -452,7 +460,7 @@ files: - name: "ps2_scph30001_35001.bin" description: "PS2, SCPH-30001/SCPH-35001 (v5.0 12/28/00 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "8accc3c49ac45f5ae2c5db0adc854633" region_check: true @@ -502,7 +510,7 @@ files: - name: "ps2_scph30001r_0427.bin" description: "PS2, SCPH-30001R (v5.0 04/27/01 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "b107b5710042abe887c0f6175f6e94bb" region_check: true @@ -522,7 +530,7 @@ files: - name: "ps2_scph30001r_0704.bin" description: "PS2, SCPH-30001R (v5.0 07/04/01 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "18bcaadb9ff74ed3add26cdf709fff2e" region_check: true @@ -542,7 +550,7 @@ files: - name: "ps2_scph30001r_1004.bin" description: "PS2, SCPH-30001R (v5.0 10/04/01 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "7200a03d51cacc4c14fcdfdbc4898431" region_check: true @@ -572,7 +580,7 @@ files: - name: "ps2_scph39001.bin" description: "PS2, SCPH-39001 (v5.0 02/07/02 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "d5ce2c7d119f563ce04bc04dbc3a323e" region_check: true @@ -662,7 +670,7 @@ files: - name: "ps2_dtlh50001_0325.bin" description: "PS2, DTL-H50001 (v5.0 03/25/03 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "eb960de68f0c0f7f9fa083e9f79d0360" region_check: true @@ -672,7 +680,7 @@ files: - name: "ps2_scph50001_0325.bin" description: "PS2, SCPH-50001 (v5.0 03/25/03 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "8aa12ce243210128c5074552d3b86251" region_check: true @@ -712,7 +720,7 @@ files: - name: "ps2_dtlh50001_0623.bin" description: "PS2, DTL-H50001 (v5.0 06/23/03 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "ab9d49ad40ae49f19856ad187777b1b3" region_check: true @@ -722,7 +730,7 @@ files: - name: "ps2_scph50001_0623.bin" description: "PS2, SCPH-50001/SCPH-50010 (v5.0 06/23/03 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "35461cecaa51712b300b2d6798825048" region_check: true @@ -802,7 +810,7 @@ files: - name: "ps2_scph50011.bin" description: "PS2, SCPH-50011 (v5.0 03/29/04 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "81f4336c1de607dd0865011c0447052e" region_check: true @@ -822,7 +830,7 @@ files: - name: "ps2_scph70001.bin" description: "PS2, SCPH-70001/SCPH-70011/SCPH-70012 (v5.0 06/14/04 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "d333558cc14561c1fdc334c75d5f37b7" region_check: true @@ -902,7 +910,7 @@ files: - name: "ps2_dtlh75000a.bin" description: "PS2, DTL-H75000A (v5.0 06/20/05 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "9959ad7a8685cad66206e7752ca23f8b" region_check: true @@ -912,7 +920,7 @@ files: - name: "ps2_scph75001.bin" description: "PS2, SCPH-75001/SCPH-75010 (v5.0 06/20/05 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "929a14baca1776b00869f983aa6e14d2" region_check: true @@ -952,7 +960,7 @@ files: - name: "ps2_scph77001.bin" description: "PS2, SCPH-77001/SCPH-77010 (v5.0 02/10/06 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "cb801b7920a7d536ba07b6534d2433ca" region_check: true @@ -1002,7 +1010,7 @@ files: - name: "ps2_dtlh90000_a.bin" description: "PS2, DTL-H90000 (v5.0 09/05/06 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "21fe4cad111f7dc0f9af29477057f88d" region_check: true @@ -1012,7 +1020,7 @@ files: - name: "ps2_scph79001_90001.bin" description: "PS2, SCPH-79001/SCPH-79010/SCPH-90001 (v5.0 09/05/06 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "40c11c063b3b9409aa5e4058e984e30c" region_check: true @@ -1052,7 +1060,7 @@ files: - name: "ps2_scph90001_0220.bin" description: "PS2, SCPH-90001/SCPH-90010 (v5.0 02/20/08 A)" - region: [north-america] + region: [north-america, latin-america] required: false md5: "21038400dc633070a78ad53090c53017" region_check: true diff --git a/emulators/mednafen.yml b/emulators/mednafen.yml index 0f4d6c6b..2053f6b6 100644 --- a/emulators/mednafen.yml +++ b/emulators/mednafen.yml @@ -284,13 +284,13 @@ files: - name: "scph5501.bin" system: sony-playstation description: "SCPH-5501 / v3.0A BIOS" - region: [north-america] + region: [north-america, latin-america] required: true size: 524288 sha256: "11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef" validation: [size, sha256] source_ref: "psx/psx.cpp:1764-1769, 1773-1781, 2374, 252" - note: "Default of psx.bios_na. The BIOS table carries 24 recognised dumps in total, two of them flagged bad (psx.cpp:228-268)." + note: "Default of psx.bios_na. The BIOS table carries 24 recognised dumps in total, two of them flagged bad (psx.cpp:228-268). Picked for REGION_NA: a SYSTEM.CNF serial whose third letter is U, a licence string naming America, and a disc read as Japanese whose system area fails the Japanese BIOS check (psx.cpp:1324-1325, 1372-1376, 1401-1437, 1764-1769)." - name: "scph5502.bin" system: sony-playstation diff --git a/emulators/rustation.yml b/emulators/rustation.yml index b043fb0b..e2f5238f 100644 --- a/emulators/rustation.yml +++ b/emulators/rustation.yml @@ -17,6 +17,10 @@ notes: > then validates the full binary against an internal SHA-256 database (lifted from Mednafen). Region must match the loaded disc. Known-bad dumps are rejected. No filename requirement. No HLE fallback. + The disc region comes from the sector 4 licence string alone: "Inc" is Japan, + "America" and "of America" are NorthAmerica, "Europe" is Europe, and any other + string refuses the disc (upstream src/cdrom/disc/mod.rs:56-99, + source src/lib.rs:71-82, 170-215). "Boot to BIOS menu" core option allows booting without a disc. Database contains 24 entries (22 good, 2 known-bad rejected) covering BIOS versions 1.0 through 4.5. @@ -40,7 +44,7 @@ files: - name: "scph5501.bin" description: "SCPH-5501 (v3.0 A)" - region: [north-america] + region: [north-america, latin-america] required: true size: 524288 validation: [size, sha256] @@ -139,7 +143,7 @@ files: # North America alternatives - name: "scph1001_v20.bin" description: "SCPH-1001 (v2.0 A)" - region: [north-america] + region: [north-america, latin-america] required: false size: 524288 validation: [size, sha256] @@ -148,7 +152,7 @@ files: - name: "scph1001_v21.bin" description: "SCPH-1001 (v2.1 A)" - region: [north-america] + region: [north-america, latin-america] required: false size: 524288 validation: [size, sha256] @@ -157,7 +161,7 @@ files: - name: "scph1001.bin" description: "SCPH-1001 (v2.2 A)" - region: [north-america] + region: [north-america, latin-america] required: false size: 524288 validation: [size, sha256] @@ -166,7 +170,7 @@ files: - name: "scph7001.bin" description: "SCPH-7001 (v4.1 A)" - region: [north-america] + region: [north-america, latin-america] required: false size: 524288 validation: [size, sha256] @@ -175,7 +179,7 @@ files: - name: "scph101.bin" description: "SCPH-101 (v4.5 A)" - region: [north-america] + region: [north-america, latin-america] required: false size: 524288 validation: [size, sha256] diff --git a/emulators/swanstation.yml b/emulators/swanstation.yml index eeabfe42..9ae4477c 100644 --- a/emulators/swanstation.yml +++ b/emulators/swanstation.yml @@ -28,6 +28,14 @@ notes: | ref: src/core/bios.cpp:28-71 (s_image_infos) Each entry has: description, region, hash, patch_compatible flag. + The console region picks the image, Auto by default. NTSC-U answers the + "Sony Computer Entertainment Amer ica" licence string, a SCUS or SLUS + executable, a disc whose region the detector cannot read, an image that + fails to open and a boot without content. + ref: src/core/system.cpp:193-209, 401-456, 592-645 + ref: src/core/host_interface.cpp:100-183 (FindBIOSImageInDirectory keeps a region match) + ref: src/libretro/libretro_core_options.h:82-95 (swanstation_Console_Region, default Auto) + Upstream DuckStation has evolved significantly (105 entries, PS2 BIOS, OpenBIOS, priority system). SwanStation is frozen at the fork point. @@ -45,7 +53,7 @@ files: - name: "scph5501.bin" description: "SCPH-5501, 5503, 7003 (v3.0 11-18-96 A)" - region: [north-america] + region: [north-america, latin-america] required: false hle_fallback: true md5: "490f666e1afb15b7362b406ed1cea246" diff --git a/tests/test_region.py b/tests/test_region.py index a2e853bc..cc75a2b7 100644 --- a/tests/test_region.py +++ b/tests/test_region.py @@ -907,6 +907,15 @@ class RegionalRequestsKeepWhatTheCodeLoads(unittest.TestCase): ("pcsx_rearmed", ["brazil", "japan"], "scph1001.bin"), ("blastem", ["australia", "north-america"], "bios_CD_E.bin"), ("kega-fusion", ["australia", "north-america"], "eu_mcd1_9210.bin"), + ("ares", ["brazil", "japan"], "scph5501.bin"), + ("beetle_psx", ["brazil", "japan"], "scph5501.bin"), + ("mednafen", ["brazil", "japan"], "scph5501.bin"), + ("swanstation", ["brazil", "japan"], "scph5501.bin"), + ("rustation", ["brazil", "japan"], "scph5501.bin"), + ("rustation", ["brazil", "japan"], "scph101.bin"), + ("duckstation", ["brazil", "japan"], "scph5501.bin"), + ("duckstation", ["brazil", "japan"], "scph7001.bin"), + ("duckstation", ["brazil", "japan"], "ps2_scph39001.bin"), ) def test_each_request_keeps_its_file(self): @@ -1152,6 +1161,35 @@ class PcsxRearmedUsSlotIsTheDefault(unittest.TestCase): self.assertIn("latin-america", entry["region"]) +class PlayStationUsImageAnswersTheAmericaLicence(unittest.TestCase): + """Every PlayStation core here picks its US image for a disc licensed by + Sony Computer Entertainment America, the licence the Americas share: + ares (mia/medium/playstation.cpp:66-73), Beetle PSX (libretro.c:2249-2254), + Mednafen (psx.cpp:1372-1376), SwanStation and DuckStation + (GetRegionFromSystemArea, plus every unread region), Rustation + (src/cdrom/disc/mod.rs:81-90). Tagged north-america alone, a --region + brazil,japan pack withdrew the image those discs boot with.""" + + COUNTS = {"ares": 1, "beetle_psx": 1, "mednafen": 1, "swanstation": 1, + "rustation": 6, "duckstation": 28} + + def test_every_us_image_includes_latin_america(self): + from common import load_emulator_profiles + + profiles = load_emulator_profiles("emulators") + for name, count in self.COUNTS.items(): + tagged = [ + f for f in profiles[name]["files"] + if "north-america" in (f.get("region") or []) + and f.get("system", "sony-playstation") == "sony-playstation" + ] + with self.subTest(profile=name): + self.assertEqual(len(tagged), count) + for entry in tagged: + with self.subTest(profile=name, name=entry["name"]): + self.assertIn("latin-america", entry["region"]) + + class FusionSmsExportBiosFollowsTheSetting(unittest.TestCase): """Kega Fusion tells a Japanese Master System cart from an export one by the header, then picks USA or EUR from its CountryOrder setting or a CRC32